1

私はこのようなリストのリストを持っています:-

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

これらを実行すると、次のような出力が得られました。これらがどのように機能しているかわかりません。

>>>[j for i in lst for j in i]
[1, 2, 3, 4, 5, 6, 4, 5, 6, 7, 8, 9]

>>>[j for j in i for i in lst]
[8, 8, 8, 8, 9, 9, 9, 9]

このような出力がどのように得られているかを誰か説明してもらえますか?この2つの反復の違いは何ですか?

4

2 に答える 2

12

最初の LC の最後に、次のiものが割り当てられ[8,9]ます。

>>> lis = [[1, 2, 3, 4, 5, 6], [4, 5, 6], [7], [8, 9]]
>>> [j for i in lis for j in i]
[1, 2, 3, 4, 5, 6, 4, 5, 6, 7, 8, 9]
>>> i
[8, 9]

2 番目の LC では、これを繰り返し処理していますi

>>> [j for j in i for i in lis]
[8, 8, 8, 8, 9, 9, 9, 9]

両方の LC は (ほぼ) 以下と同等です。

>>> lis = [[1, 2, 3, 4, 5, 6], [4, 5, 6], [7], [8, 9]]
>>> for i in lis:
...     for j in i:
...         print j,
...         
1 2 3 4 5 6 4 5 6 7 8 9
>>> i
[8, 9]
>>> for j in i:
...     for i in lis:
...         print j,
...         
8 8 8 8 9 9 9 9

これは py3.x で修正されました:

特に、ループ制御変数が周囲のスコープに漏れなくなりました。

デモ (py 3.x):

>>> lis = [[1, 2, 3, 4, 5, 6], [4, 5, 6], [7], [8, 9]]
>>> [j for i in lis for j in i]
[1, 2, 3, 4, 5, 6, 4, 5, 6, 7, 8, 9]
>>> i
Traceback (most recent call last):
NameError: name 'i' is not defined

>>> j
Traceback (most recent call last):
NameError: name 'j' is not defined
于 2013-09-05T08:19:47.877 に答える
1
[j for i in list for j in i]

これは似ています

result = []
for i in list:
    for j in i:
        result.append(j)

一般に、リスト内包表記 like[p for a in b if c == d for e in f if etc]は like に変換されます

reuslt = []
for a in b: if c == d: for e in f: if etc: result.append(p)

[j for j in i for i in list]

通常、これは実行されません。おそらく、以前にあると定義iしたでしょう[8, 9]

>>> [j for j in i for i in list]
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
NameError: name 'i' is not defined

これは、

result = []
for j in i: 
    for i in list:
        result.append(j)

したがって、i最初に が定義されていないと、ループは機能しません。

于 2013-09-05T08:23:45.250 に答える