python - 列表理解与可迭代。 Python新手

标签 python list-comprehension

假设我有一个数组:

array=[1,0,2,3,4,0,0,5,6,0]

我想要一个只返回数字而不是零的列表。所以我这样做了并且有效:

print(list(y for y in array if y!=0)

我尝试了另一种没有列表理解的方法,但它不起作用,有人可以解释为什么吗?

for y in array:
    if y!=0:
        print(list(y))

打印不带 0 的数字列表的另一种方法是什么?

编辑:我尝试使用 for 循环来解决这个问题,如果我在顶部创建一个空列表,它就会起作用。它有效,但我不明白为什么!但为什么这个行得通而另一个不行呢?就速度/内存而言,这个或列表理解哪个更有效?

array=[1,0,2,3,4,0,0,5,6,0]
list=[]
for y in array:
    if y!=0:
        list.append(y)
print(list)

最佳答案

让我们仔细看看您认为正确的是什么:

for y in array:
    if y!=0:
        print(list(y))

所以我们遍历数组中的每个值。如果值不为零,我们打印 list(y)。问题从这里开始。因为 y 是一个整数,所以 list(y) 返回一个错误,因为你不能将一个整数转换成一个列表。如果您执行 print(y),它会起作用。

但随之而来的是另一个问题。如果我们打印列表中不为零的每个元素,我们会得到类似这样的结果,因为该代码只会按顺序打印:

1
2
3
4
5
6

您在问题中声明您想要一个列表。所以这段代码也不起作用,因为没有存储列表。所以我们终于找到了正确的答案:

array=[1,0,2,3,4,0,0,5,6,0]
list=[]
for y in array:
    if y!=0:
        list.append(y)
print(list)

这个答案将每个非零的 y 值存储在列表中,然后最终打印出列表。

编辑:

这是列表理解的工作原理:

首先,我不禁注意到您犯了一个语法错误。 :P 你忘记了结尾的括号!这是正确的代码: print(list(y for y in array if y != 0))

其次,我需要声明这不是列表综合。那是一个发电机。有细微差别。

列表推导当场生成列表。列表理解如下所示:[y for y in array if y != 0]

一个生成器,就是你上面用的,是一个表达式被存储。它看起来像这样:y for y in array if y != 0

因此,与其使用 list(y for y in array if y != 0,您可以直接转到 [y for y in array if y != 0].

所以现在我将解释“列表理解”(生成器表达式)的实际工作原理。它首先遍历 array 的每个值。它检查该值是否不为零。如果不是,它会将 y 添加到输出列表。所以基本上,生成器表达式与带有 for 循环的第二个工作代码相同,除了 python 为您创建输出列表,增加了一些便利。

关于python - 列表理解与可迭代。 Python新手,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33990443/

相关文章:

Python - 将列表列表中的数字均匀划分

Python 列表理解从平面列表映射以模仿嵌套结构

python - 提高非常大的数据帧上的迭代性能

python - 创建具有理解力的字典?

python - tkinter.Text 小部件超出网格管理器限制

python - 两列匹配列表的两个元素

python - 使用多处理和 h5py

python - Django 使用 AJAX 查看返回值

python - 如何从 python 记录器获取文件名

python - 将列表拆分为值上的嵌套列表