如何压缩python列表的列表理解工作?

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'不存在.我的思绪完全扭曲,帮助!

Chr*_*sso 8

让我们来看看你的列表理解,但首先让我们从列表理解开始,这是最容易的.

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


Tjo*_*rie 5

对于想要快速回答的懒惰开发人员:

>>> a = [[1,2], [3,4]]
>>> [i for g in a for i in g]
[1, 2, 3, 4]
Run Code Online (Sandbox Code Playgroud)

  • 这如何回答这个问题? (2认同)