実践・上級問題チェック

問題 25 /40

次のコードと同じ結果になるものはどれか。

-------------------------------
result = []

for i in 'AB':
    for v in 'AB':
        result.append(i + v)

print(result)
-------------------------------

選択肢はすべて、itertoolsモジュールをインポートしているものとする。

選択 1

[i[0] + i[1] for i in itertools.permutations('AB', 2)]

選択 2

[i[0] + i[1] for i in itertools.combinations('AB', 2)]

選択 3

[i[0] + i[1] for i in itertools.product('AB', repeat=2)]

選択 4

[i[0] + i[1] for i in itertools.combinations_with_replacement('AB', 2)]

解説

選択肢3が正解です。

問題文の結果は「['AA', 'AB', 'BA', 'BB']」になります。

-------------------------------
【選択肢1】
[i[0] + i[1] for i in itertools.permutations('AB', 2)]

結果は['AB', 'BA']になります。

permutations()関数は順列です。

順列とは、区別可能なn個のものからk個を選んで順に並べます。

permutations()関数は、第1引数で出力対象のイテラブルオブジェクト、第2引数で出力する長さを指定します。

選択肢1の場合、ABから2個を選んで順に並べます。

AAなどの重複は出力されません。


-------------------------------
【選択肢2】
[i[0] + i[1] for i in itertools.combinations('AB', 2)]

結果は['AB']になります。

combinations()関数は、重複なしの組み合わせを出力します。

ABとBAのように同じ要素の組み合わせは出力されません。


-------------------------------
【選択肢3】
[i[0] + i[1] for i in itertools.product('AB', repeat=2)]

結果は問題文と同じで['AA', 'AB', 'BA', 'BB']になります。

product()関数は、引数のイテラブルオブジェクトに対して、すべての組み合わせを返します。

デカルト積(直積)と呼ばれており、問題文のネストされたfor文と同じ結果になります。

なお、itertoolsモジュールの各関数は第2引数で出力する長さを指定しますが、product()関数だけは「repeat=[n]」の形式で記述します。


-------------------------------
【選択肢4】
[i[0] + i[1] for i in itertools.combinations_with_replacement('AB', 2)]

結果は['AA', 'AB', 'BB']になります。

combinations_with_replacement()関数は、重複ありの組み合わせを出力します。

ABとBAのように同じ要素の組み合わせは出力されません。


-------------------------------


まとめると以下になります。

-------------------------------
【permutations()】
['AB', 'BA']
重複なし。順番に並べる。

【combinations()】
['AB']
重複なし。順番に並べて、同じ組み合わせなし。

【combinations_with_replacement()】
['AA', 'AB', 'BB']
重複あり。順番に並べて、同じ組み合わせなし。

【product()】
['AA', 'AB', 'BA', 'BB']
重複あり。すべての組み合わせを並べる。
-------------------------------


(公式書籍 p.213-214)