Python:为什么列表理解会产生一个生成器?

时间:2015-01-15 16:35:29

标签: python generator list-comprehension

a=[['1','3','2'],['11','22','33']]
k = [(float(a[i][j]) for j in range(0,3)) for i in range(0,2)]
>>> print k
[<generator object <genexpr> at 0x7f1a9d568f50>, <generator object <genexpr> at 0x7f1a9d568fa0>]

但我想得到[(1,3,2),(11,22,33)]  为什么列表理解会产生一个生成器?

2 个答案:

答案 0 :(得分:9)

您在列表理解((x for x in ...))中有generator expression[x for x in ...])。这将返回生成器对象列表。像这样更改代码

a = [['1','3','2'],['11','22','33']]
k = [[float(a[i][j]) for j in range(0,3)] for i in range(0,2)]

print(k)
# [[1.0, 3.0, 2.0], [11.0, 22.0, 33.0]]

答案 1 :(得分:6)

您在列表推导表达式中使用生成器表达式:

(float(a[i][j]) for j in range(0,3))

如果你希望它像列表理解那样执行,那么那个列表理解

[[float(a[i][j]) for j in range(3)] for i in range(2)]

如果您需要这些元组,那么您必须明确调用tuple()

[tuple(float(a[i][j]) for j in range(3)) for i in range(2)]

tuple() callable将驱动生成器表达式以生成这些值的元组。除此之外还有no such thing as a tuple comprehension

您可以直接遍历a和嵌套列表 ,而不是使用范围:

[tuple(float(v) for v in nested) for nested in a]

演示:

>>> a=[['1','3','2'],['11','22','33']]
>>> [tuple(float(v) for v in nested) for nested in a]
[(1.0, 3.0, 2.0), (11.0, 22.0, 33.0)]