実践・上級問題チェック
問題 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)