2013-09-05 2 views
1

У меня есть список из списка, как это: -Как список итераций списков работает в python?

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

Если я запускаю это я получил выход как these.I я не получаю, как они работают.

>>>[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

Подсказка: 'list' - это имя Python для reserverd. Не используйте его как имя. –

ответ

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] 

Во второй 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 

не

This has been fixed in py3.x:

, в частности, управляющие переменные цикла больше не просочилась в окружающей области.

Demo (пй 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 
+0

Я предполагаю, что этот python 2.x связан с тем, что местные жители понимания все еще течет, или я ошибаюсь? – Hyperboreus

+0

@Hyperboreus Да, это было исправлено в py3.x –

+0

@AshwiniChaudhary спасибо большое. Из вашего сообщения я получил то, что хотел узнать. Еще раз. – Nullify

1
[j for i in list for j in i] 

Это похоже на

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

В целом список понимание, как [p for a in b if c == d for e in f if etc] будут переведены нравится

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 не определен во-первых, цикл не будет работать.

+1

Он работает в py2.x, но вы получите 'NameError' в py3.x. –

+0

@KennyTm thanks – Nullify

+0

@AshwiniChaudhary: вы получите NameError, если вы запустите '[j для j в i для i в списке]' самостоятельно (без запуска '[j для i в списке для j в i]' first). – kennytm

Смежные вопросы