Skip to main content
 首页 » 编程设计

python之列表迭代列表如何在 python 中工作

2025年05月04日11落叶

我有一个这样的列表:-

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] 

谁能解释一下它们是如何给出这样的输出的。这两个迭代之间有什么不同?

请您参考如下方法:

在第一个 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 :

in particular the loop control variables are no longer leaked into the surrounding scope.

演示(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