それを分解しましょう。
簡単なリスト内包表記:
[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