Python: 为什么列表理解会产生一个生成器?
Python: why does list comprehension produce a generator?
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)]
为什么列表理解会产生生成器?
您在列表理解 ([x for x in ...]
) 中有一个 generator expression ((x for x in ...)
)。这将 return 一个生成器对象列表。像这样更改代码
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]]
您正在列表理解表达式中使用生成器表达式:
(float(a[i][j]) for j in range(0,3))
如果你希望它像列表理解一样执行,请将 that 设为列表理解 too:
[[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()
可调用函数将驱动生成器表达式生成这些值的元组。有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)]
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)] 为什么列表理解会产生生成器?
您在列表理解 ([x for x in ...]
) 中有一个 generator expression ((x for x in ...)
)。这将 return 一个生成器对象列表。像这样更改代码
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]]
您正在列表理解表达式中使用生成器表达式:
(float(a[i][j]) for j in range(0,3))
如果你希望它像列表理解一样执行,请将 that 设为列表理解 too:
[[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()
可调用函数将驱动生成器表达式生成这些值的元组。有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)]