:1つのリストに可能な組み合わせを1つずつ追加するにはどうすればよいですか?たとえば
list1 = [1, 2, 3]
list2 = [4, 5, 6]
募集結果:
NewList = [4, 5, 6, 8, 10, 12, 12, 15, 18]
:1つのリストに可能な組み合わせを1つずつ追加するにはどうすればよいですか?たとえば
list1 = [1, 2, 3]
list2 = [4, 5, 6]
募集結果:
NewList = [4, 5, 6, 8, 10, 12, 12, 15, 18]
3つの可能なアプローチ:
読み取り可能
new_list = []
for a in list1:
for b in list2:
new_list.append(a * b)
これは何が起こっているのか、それは非常に明確になりますが、new_list.append()
に4行と繰り返し呼び出しを必要とし、わずかです非効率的な。
簡潔
new_list = [a * b for a in list1 for b in list2]
これは非常にコンパクトですが、多くの人にとってはマルチプルfor
list comprehensionsのネスティングが左から右または右に行くかどうかを覚えておくの瞬間または2を取ります-左。
レイジー
from itertools import product
new_list = [a * b for a, b in product(list1, list2)]
これはlist1
とlist2
がgeneratorsまたは他のワンショット、いい加減に評価さイテラブル、例えばある場合でも正常に動作します
>>> from itertools import count, islice
>>> list1 = islice(count(1), 3)
>>> list2 = islice(count(4), 3)
>>> [a * b for a, b in product(list1, list2)]
[4, 5, 6, 8, 10, 12, 12, 15, 18]
...最初の2つのアプローチでは機能しません。 Pythonでの変数に名前を付けるための従来の方法で、私はこれらの例にnew_list
ではなくNewList
を使用しました
注意、。
バイトコードの実行を避けるために、CPythonのすべての作業をC層にプッシュするだけです。 starmap'、 '演算子import mul'、' new_list = list(starmap(mul、product(list1、list2))) 'のように、ローカルのテストケースでは(小さなint値を持つ2つの10要素の入力があります)、そのようなCレイヤーに作業をプッシュすると、ランタイムが〜1/6(これは50x50の場合にとどまりました。小さな入力が、それだけです)。一般的な警告が適用されます:これは時期尚早の最適化であり、リストの理解はPythonicです。 – ShadowRanger
あなたはこのケースでは、あなたが上記の持っていた何を与えることができNewList
を、印刷して結果を確認することができます。 list1
とlist2
は、上記と同様にこのコードの上に初期化されています。
NewList = []
for item1 in list1:
for item2 in list2:
NewList.append(item1*item2)
リスト1の項目のためのNewList = []:リスト2の項目2のための:NewList.append(item1 * item2) –