如何理解压平python列表?

2024-06-11 02:14:47 发布

您现在位置:Python中文网/ 问答频道 /正文

我最近寻找了一种方法来将嵌套的python列表扁平化,比如:[[1,2,3],[4,5,6]],变成:[1,2,3,4,5,6]。

Stackoverflow一如既往地有用,我发现a post有了这个巧妙的列表理解:

l = [[1,2,3],[4,5,6]]
flattened_l = [item for sublist in l for item in sublist]

我以为我理解列表理解的工作原理,但显然我一点也不知道。最让我不解的是,除了以上的理解,这也同样存在(尽管结果并不相同):

exactly_the_same_as_l = [item for item in sublist for sublist in l]

有人能解释一下python是如何解释这些事情的吗?基于第二个压缩,我希望python将其解释回前面,但显然情况并非总是如此。如果是,第一个理解应该抛出一个错误,因为“子列表”不存在。我的思想完全扭曲了,救命!


Tags: the方法in列表forasitemstackoverflow
3条回答

让我们来看看你的列表理解,但首先让我们从最简单的列表理解开始。

l = [1,2,3,4,5]
print [x for x in l] # prints [1, 2, 3, 4, 5]

您可以将其视为一个for循环,其结构如下:

for x in l:
    print x

现在让我们来看另一个:

l = [1,2,3,4,5]
a = [x for x in l if x % 2 == 0]
print a # prints [2,4]

与此完全相同:

a = []
l = [1,2,3,4,5]
for x in l:
    if x % 2 == 0:
        a.append(x)
print a # prints [2,4]

现在让我们看看您提供的示例。

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]

对于列表理解,请从最左边的For循环开始,然后按您的方式进行。在本例中,变量item将被添加。它将产生相当于:

l = [[1,2,3],[4,5,6]]
flattened_l = []
for sublist in l:
    for item in sublist:
        flattened_l.append(item)

最后一次

exactly_the_same_as_l = [item for item in sublist for sublist in l]

使用相同的知识,我们可以创建一个for循环并查看它的行为

for item in sublist:
    for sublist in l:
        exactly_the_same_as_l.append(item)

现在,上面的一个之所以有效,是因为当创建flatten时,它还创建了sublist。这就是为什么没有抛出错误的范围界定原因。如果不首先定义展平的l运行它,您将得到一个NameError

for循环是从左到右计算的。任何list comprehension都可以重写为for循环,如下所示:

l = [[1,2,3],[4,5,6]]
flattened_l = []
for sublist in l:
    for item in sublist:
        flattened_l.append(item)

无论您选择将列表简明地写成列表理解,还是在此扩展版本中,以上代码都是用于展平列表的正确代码。

您编写的第二个列表理解将引发名称错误,因为“子列表”尚未定义。通过将列表理解写成for循环,您可以看到这一点:

l = [[1,2,3],[4,5,6]]
flattened_l = []
for item in sublist:
    for sublist in l:
        flattened_l.append(item)

运行代码时没有看到错误的唯一原因是,在实现第一个列表理解时,您以前定义了子列表。

有关详细信息,您可能需要签出Guido's tutorial on list comprehensions

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

>>> a = [[1,2], [3,4]]
>>> [i for g in a for i in g]
[1, 2, 3, 4]

相关问题 更多 >