我最近寻找了一种方法来将嵌套的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将其解释回前面,但显然情况并非总是如此。如果是,第一个理解应该抛出一个错误,因为“子列表”不存在。我的思想完全扭曲了,救命!
让我们来看看你的列表理解,但首先让我们从最简单的列表理解开始。
您可以将其视为一个for循环,其结构如下:
现在让我们来看另一个:
与此完全相同:
现在让我们看看您提供的示例。
对于列表理解,请从最左边的For循环开始,然后按您的方式进行。在本例中,变量item将被添加。它将产生相当于:
最后一次
使用相同的知识,我们可以创建一个for循环并查看它的行为
现在,上面的一个之所以有效,是因为当创建flatten时,它还创建了
sublist
。这就是为什么没有抛出错误的范围界定原因。如果不首先定义展平的l运行它,您将得到一个NameError
for循环是从左到右计算的。任何
list comprehension
都可以重写为for循环,如下所示:无论您选择将列表简明地写成列表理解,还是在此扩展版本中,以上代码都是用于展平列表的正确代码。
您编写的第二个列表理解将引发名称错误,因为“子列表”尚未定义。通过将列表理解写成for循环,您可以看到这一点:
运行代码时没有看到错误的唯一原因是,在实现第一个列表理解时,您以前定义了子列表。
有关详细信息,您可能需要签出Guido's tutorial on list comprehensions。
对于需要快速回答的懒惰的开发人员:
相关问题 更多 >
编程相关推荐