【发布时间】:2014-10-29 17:11:10
【问题描述】:
我最近寻找一种将嵌套 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循环,用print看看发生了什么
-
第二个推导只起作用,因为
item和sublist保留了第一个推导的最终值。首先运行那个(或del item; del sublist然后执行),它会按预期给出NameError。这里的奇怪之处在于 Python 的作用域规则,而不是推导式。 -
@MarkWhitfield 仅在 python2 中...在 python3 中 list-comprehensions 表现为 genexps,并且不会泄漏外部范围内的变量。
-
谢谢大家,现在完全有道理了!
-
无论如何
for是按顺序排列的:您从左到右读取,这就是它们的执行顺序。最左边的for是外 循环,最右边的for是内 循环。当您将理解转换为显式循环时,您只需在for循环之间添加冒号即可:[item for sublist in l for item in sublist]"becomes"for sublist in l: for item in sublist: item