79
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 はリスト内のリストであることは理解していますが、最初と最後でのandfor elem in vic
の使用法がよくわかりません。numfor num in elem

Pythonはこれをどのように解釈しますか?
見る順番は?

4

4 に答える 4

143

それを分解しましょう。

簡単なリスト内包表記:

[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 ループを持つようなものです。

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('#')] 

これにより、行がハッシュタグ ( ) で始まらない限り、ファイル内のすべての行が得られます#。他の行はスキップされます。

列車の「テール」を使用する秘訣は、すべてのループから最終的な「エンジン」または「結果」を取得すると同時に、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 ループでは:

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

5
6
7
8
9
于 2013-07-15T15:29:04.127 に答える