jko*_*ian 7 python list-comprehension
我最近寻找一种方法来展平嵌套的python列表,如下所示:[[1,2,3],[4,5,6]],这个:[1,2,3,4,5,6] .
Stackoverflow一如既往地有用,我找到了一篇具有这种巧妙的列表理解的帖子:
l = [[1,2,3],[4,5,6]]
flattened_l = [item for sublist in l for item in sublist]
Run Code Online (Sandbox Code Playgroud)
我以为我理解列表理解是如何工作的,但显然我没有得到最微妙的想法.最让我困惑的是,除了上面的理解之外,这也会运行(尽管它没有给出相同的结果):
exactly_the_same_as_l = [item for item in sublist for sublist in l]
Run Code Online (Sandbox Code Playgroud)
有人能解释一下python如何解释这些东西吗?基于第二个扩展,我希望python将它解释回来,但显然并非总是如此.如果是,第一个理解应该抛出一个错误,因为'sublist'不存在.我的思绪完全扭曲,帮助!
让我们来看看你的列表理解,但首先让我们从列表理解开始,这是最容易的.
l = [1,2,3,4,5]
print [x for x in l] # prints [1, 2, 3, 4, 5]
Run Code Online (Sandbox Code Playgroud)
您可以像这样结构化的for循环一样来看待它:
for x in l:
print x
Run Code Online (Sandbox Code Playgroud)
现在让我们看看另一个:
l = [1,2,3,4,5]
a = [x for x in l if x % 2 == 0]
print a # prints [2,4]
Run Code Online (Sandbox Code Playgroud)
这与此完全相同:
a = []
l = [1,2,3,4,5]
for x in l:
if x % 2 == 0:
a.append(x)
print a # prints [2,4]
Run Code Online (Sandbox Code Playgroud)
现在让我们来看看你提供的例子.
l = [[1,2,3],[4,5,6]]
flattened_l = [item for sublist in l for item in sublist]
print flattened_l # prints [1,2,3,4,5,6]
Run Code Online (Sandbox Code Playgroud)
对于列表理解,从最左边开始循环并继续工作.在这种情况下,变量item将被添加.它会产生这个等价物:
l = [[1,2,3],[4,5,6]]
flattened_l = []
for sublist in l:
for item in sublist:
flattened_l.append(item)
Run Code Online (Sandbox Code Playgroud)
现在是最后一个
exactly_the_same_as_l = [item for item in sublist for sublist in l]
Run Code Online (Sandbox Code Playgroud)
使用相同的知识,我们可以创建一个for循环,看看它将如何表现
for item in sublist:
for sublist in l:
exactly_the_same_as_l.append(item)
Run Code Online (Sandbox Code Playgroud)
现在,上述工作的唯一原因是因为当创建flattened_l时,它也会被创建sublist
.这是一个范围界定的原因,为什么这不会引发错误.如果你在没有首先定义flattened_l的情况下运行它,你会得到一个NameError
对于想要快速回答的懒惰开发人员:
>>> a = [[1,2], [3,4]]
>>> [i for g in a for i in g]
[1, 2, 3, 4]
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
4853 次 |
最近记录: |