このメモリ技術は私に大いに役立ちます:
[ <RETURNED_VALUE> <OUTER_LOOP1> <INNER_LOOP2> <INNER_LOOP3> ... <OPTIONAL_IF> ]
そして今、あなたはR eturn + O uter-loopを唯一のR ight Oと考えることができます RDER
上記を知っていると、3つのループでも包括的なリスト内の順序は簡単に見えます。
c=[111, 222, 333]
b=[11, 22, 33]
a=[1, 2, 3]
print(
[
(i, j, k) # <RETURNED_VALUE>
for i in a for j in b for k in c # in order: loop1, loop2, loop3
if i < 2 and j < 20 and k < 200 # <OPTIONAL_IF>
]
)
[(1, 11, 111)]
上記は単なるaであるため:
for i in a: # outer loop1 GOES SECOND
for j in b: # inner loop2 GOES THIRD
for k in c: # inner loop3 GOES FOURTH
if i < 2 and j < 20 and k < 200:
print((i, j, k)) # returned value GOES FIRST
1つのネストされたリスト/構造を反復する場合、技術は同じです:a
質問から:
a = [[1,2],[3,4]]
[i2 for i1 in a for i2 in i1]
which return [1, 2, 3, 4]
ネストされた別のレベル
a = [[[1, 2], [3, 4]], [[5, 6], [7, 8, 9]], [[10]]]
[i3 for i1 in a for i2 in i1 for i3 in i2]
which return [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
等々
[x for b in a for x in b]
これは常にpythonに関するバグでした。この構文は非常に逆です。の一般的な形式でx for x in y
は、常にforの直後に変数があり、forの左側の式にフィードされます。二重理解を行うとすぐに、最後に反復された変数が突然「遠く」になります。それは厄介だし、まったく自然に読んでいません