1. ホーム
  2. python

Python list comprehension double for

2023-07-19 06:45:08

質問

vec = [[1,2,3], [4,5,6], [7,8,9]]
print [num for elem in vec for num in elem]      <----- this

>>> [1, 2, 3, 4, 5, 6, 7, 8, 9]

これには騙されました。

からelemはリスト内部のリストと理解しています。 for elem in vic

の使い方がよくわからないのですが numfor num in elem を最初と最後に記述します。

pythonはこれをどう解釈するのでしょうか?

どのような順序で見るのでしょうか?

どのように解決するのですか?

分解してみましょう。

簡単なリスト理解。

[x for x in collection]

これはパーツに分けるとわかりやすいですね。 [A for B in C]

  • A は結果のリストに含まれる項目です。
  • B はコレクション内の各項目 C
  • C はコレクションそのものです。

このように、人は書くことができる。

[x.lower() for x in words]

リスト内の単語をすべて小文字に変換するため。


このように別のリストで複雑にする場合です。

[x for y in collection for x in y] # [A for B in C for D in E]

ここで、特別なことが起こります。最終的なリストには A の項目と A の中にある B の中にあるので、リスト内包にそれを伝えなければなりません。

  • A は結果のリストに含まれる項目です。
  • B はコレクション内の各項目 C
  • C はコレクションそのものです。
  • D はコレクション内の各項目 E (である(この場合、さらに A )
  • E は別のコレクションです(この場合。 B )

このロジックは、通常のforループと同様です。

for y in collection:     #      for B in C:
    for x in y:          #          for D in E: (in this case: for A in B)
        # receive x      #              # receive A


これを発展させ、素晴らしい例+説明をするために、電車があると想像してください。

電車のエンジン(前)は必ずそこにある(リストコンパの結果)

次に、列車の車両は何両でもあり、それぞれの列車の車両は、形が for x in y

リスト内包はこのようになります。

[z for b in a for c in b for d in c ... for z in y]

というのは、このような普通のfor-loopがあるようなものでしょう。

for b in a:
    for c in b:
        for d in c:
            ...
                for z in y:
                    # have z

つまり、行を下ってインデントするのではなく、リストコンパチブルでは次のループを最後に追加すればよいのです。

電車の例えに戻ると

Engine - Car - Car - Car ... Tail

末尾とは何ですか?末尾はリストコンパチブルの中では特別なものです。あなたは は必要ありません。 は必要ありませんが、もし末尾があれば、末尾は条件となり、この例を見てください。

[line for line in file if not line.startswith('#')] 

これは、ハッシュタグで始まらない限り、ファイル内のすべての行を取得することができます ( # ) で始まっていなければ、他の行はスキップされます。

列車の "tail" を使用するトリックは、すべてのループから最終的な「エンジン」または「結果」を得るのと同時に True/False をチェックすることで、通常の for ループで上記の例は次のようになります。

for line in file:
    if not line.startswith('#'):
        # have line

ご注意ください。 私の汽車の例えでは、汽車の最後には「尾」があるだけですが、条件や「尾」は次のようになります。 ごとに 車両」またはループの後である可能性があります...

例えば

>>> z = [[1,2,3,4],[5,6,7,8],[9,10,11,12]]
>>> [x for y in z if sum(y)>10 for x in y if x < 10]
[5, 6, 7, 8, 9]

通常のfor-loopで。

>>> for y in z:
    if sum(y)>10:
        for x in y:
            if x < 10:
                print x

5
6
7
8
9