假设我有一个数组:
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/