【问题标题】:Python list comprehension: Flattening a list of lists returns a list of 5sPython列表理解:展平列表列表返回5s列表
【发布时间】:2023-04-08 13:28:01
【问题描述】:

我有以下列表:

>>>> vec=[[1,2,3],[4,5,6],[7,8,9]]

要使用列表理解来展平列表列表,我可以使用:

>>>>[i for k in vec for i in k]
[1, 2, 3, 4, 5, 6, 7, 8, 9]

但如果我写:

>>>> [i for k in vec]
[5,5,5]
>>>> [i for k in vec for k in k]
[5, 5, 5, 5, 5, 5, 5, 5, 5]

甚至更改vec=[[2,89,6],[34,7,10],[812,55,7],[76765,34,99]]

>>>> [i for k in vec]
[5,5,5,5]
>>>> [i for k in vec for k in k]
[5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5]

那么发生了什么?这些 5 是从哪里来的?

【问题讨论】:

  • i 与您的列表无关,因为您不再将其用作循环变量。它仍然具有 5 的值,来自您对它所做的一些完全不相关的事情。
  • 我不知道你是怎么得到这个结果的,但是 [i for k in vec] 给出一个错误:“i”未定义...
  • 单独尝试i - 在列表理解之外。打赌是 5。

标签: list python-3.x list-comprehension


【解决方案1】:

如果您使用 Python 3 标记此问题,那么您必须在某个时候将i 反弹到 5。在 Python 3 中,listcomps 有自己的范围,因此您显示的命令甚至不起作用:

>>> vec=[[1,2,3],[4,5,6],[7,8,9]]
>>> [i for k in vec for i in k]
[1, 2, 3, 4, 5, 6, 7, 8, 9] 
>>> i
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
NameError: name 'i' is not defined
>>> [i for k in vec]
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "<stdin>", line 1, in <listcomp>
NameError: name 'i' is not defined

因为 listcomp 没有将 i 设置为任何值,它试图从外部范围获取值,并且(与您不同 :-) 我没有将其设置为任何值。

相比之下,在 Python 2 中,i 会从[i for k in vec for i in k] listcomp 中泄漏,你会得到

>>> [i for k in vec]
[9, 9, 9]
>>> [i for k in vec for k in k]
[9, 9, 9, 9, 9, 9, 9, 9, 9]

【讨论】:

    猜你喜欢
    • 2013-06-24
    • 1970-01-01
    • 2017-04-01
    • 1970-01-01
    • 1970-01-01
    • 2014-08-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多