【问题标题】:Python: why does list comprehension produce a generator?Python:为什么列表推导会产生生成器?
【发布时间】:2015-03-14 03:15:37
【问题描述】:
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)] 为什么列表推导会产生生成器?

【问题讨论】:

  • 因为(float(a[i][j]) for j in range(0,3))是一个生成器表达式
  • 因为你在里面放了一个生成器表达式?这就是(... for j in range(0, 3)) 所做的
  • [ at 0x7f1a9d568f50>, ...] 实际上是生成器的LIST
  • 从技术上讲,它是一个列表 .... 一个生成器列表。

标签: python generator list-comprehension


【解决方案1】:

您在列表理解 ([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,3,2),(11,22,33)]?
  • 是的。您可以将列表理解包装在一个元组调用中,例如[tuple([...]) for ...]。但是,我建议您查看 Martijn Pieter 的答案,因为他解释了如何以更简洁的方式获得您想要的东西 :)
【解决方案2】:

您在列表理解表达式中使用了生成器表达式:

(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)]

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-01-14
    • 1970-01-01
    • 2018-06-22
    • 1970-01-01
    • 2019-05-04
    相关资源
    最近更新 更多