对python,列表/生成器对象感到困惑

时间:2019-04-09 22:41:09

标签: python

不知道是否曾经问过这个问题,但是我找不到正确,清晰的解释。

我担心与python语法相关的事情。

在练习一些python时,我凭直觉地认为这将打印列表中的所有元素。清单1。

但是它似乎没有这样做,为什么会这样呢?

我显然可以用许多其他方式打印它;但是我无法理解这里固有的python逻辑。

list1 = [1,2,3,4]

print(list1[i] for i in range(len(list1)))

我希望输出为'[1、2、3、4],但它会打印一个生成器对象。

4 个答案:

答案 0 :(得分:4)

您需要在list1[i] for i in range(len(list))周围加上[],以表明这是一个列表。尽管list1是一个列表,但是您尝试使用生成器表达式将其打印出来,这将返回一个生成器对象(类似于列表的可迭代类型。)而未指定您想要将生成器转换为列表,它不会打印列表。 (将生成器表达式转换为列表称为列表理解。)

即使您这样做,它仍然会打印[1, 2, 3, 4]而不是1 2 3 4。您需要执行[print(list1[i], end=" ") for i in range(len(list1)))]才能正常工作。有更好的方法:请参阅donkopotamus的答案。

答案 1 :(得分:2)

表达式(list1[i] for i in range(len(list)))定义了一个生成器对象。这就是打印出来的内容。

如果您希望打印列表,则将其设为列表理解而不是生成器,然后打印:

print( [list1[i] for i in range(len(list1))] )

或者,您可以通过使用例如

将生成器传递到适当的类型,从而将生成器的评估强制为tuple(或listset)。
print(tuple(list1[i] for i in range(len(list1))))

为了获得您期望的1 2 3 4的特定输出(以空格分隔),可以通过以下方式使用str.join

>>> list1 = [1, 2, 3, 4]
>>> print(" ".join(list1[i] for i in range(len(list1))))
1 2 3 4

或将列表解压缩到print中(这在python 2中不起作用,因为在python 2 print中不是函数)

>>> print(*(list1[i] for i in range(len(list1))))
1 2 3 4

答案 2 :(得分:2)

(list1[i] for i in range(len(list1)))

确实是一个生成器对象,等效于

(x for x in list1) 

您要将生成器作为单个参数传递给print,因此print只是打印它:它不会从中提取元素。

或者,您也可以在将其传递到print时将其打开包装:

print(*(list1[i] for i in range(len(list1))))

这会将生成的序列的每个元素作为单独的参数传递给print,因此应该分别打印它们。

如果您只是想打印列表,则可以使用以下任何一种方法:

print(list1) 
print([list1[i] for i in range(len(list1))])
print([x for x in list1])

使用方括号可进行列表理解,而不是生成器表达式。

答案 3 :(得分:0)

在python中有一些叫做列表理解和生成器表达式的东西。它们是很棒的工具,您可以通过谷歌搜索找到更多信息。 Here是一个链接。

基本上,您可以在python中即时列出一个列表。

list1 = [1,2,3,4]
squared_list = [i*i for i in list1]

将返回所有项目均平方的列表。但是,我们说

squared_gen_list = (i*i for i in list1)

这将返回所谓的生成器对象。正如您从语法中看到的那样,这就是您所遇到的情况,因此您只是将其打印出来。希望能消除混乱。