【问题标题】:Difference between list() and dict() with generators [duplicate]list() 和 dict() 与生成器之间的区别 [重复]
【发布时间】:2015-08-23 21:04:52
【问题描述】:

那么下面的例子中list()dict()之间的区别背后的解释是什么:

glist = (x for x in (1, 2, 3))
print(list(glist))
print(list(glist))

gdict = {x:y for x,y in ((1,11), (2,22), (3,33))}
print(dict(gdict))
print(dict(gdict))

>>>
[1, 2, 3]
[]
{1: 11, 2: 22, 3: 33}
{1: 11, 2: 22, 3: 33}

【问题讨论】:

标签: python list dictionary generator


【解决方案1】:

举个例子会更好理解。

调用generatornext 方法来生成每个元素。

>>> a = (i for i in range(4))
>>> a.next()
0
>>> a.next()
1
>>> a.next()
2
>>> a.next()
3
>>> a.next()
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
StopIteration
>>>
>>> list(a)
[]

现在在我们的生成器对象上调用list 函数。

>>> a = (i for i in range(4))
>>> list(a)
[0, 1, 2, 3]
>>> list(a)
[]

现在在我们的列表理解中调用list

>>> a = [i for i in range(4)]
>>> list(a)
[0, 1, 2, 3]
>>> list(a)
[0, 1, 2, 3]

所以列表理解和字典理解是相似的,这会导致实际数据不像生成元素的生成器。

【讨论】:

    【解决方案2】:

    这些是完全不同的东西。第一个表达式是一个生成器:在第一次迭代之后,它被耗尽,所以进一步的迭代是空的。

    第二个是字典推导:和列表推导一样,它每次都返回一个新对象,在本例中是字典。所以每次迭代都在一个新的字典上。

    【讨论】:

      【解决方案3】:

      区别在于只有第一个表达式glist是一个生成器,第二个gdict是一个dict-comprehension。如果您将第一个更改为 [x for x in (1, 2, 3)],这两个将是等效的。

      立即评估一个理解。

      【讨论】:

        猜你喜欢
        • 2013-10-07
        • 2015-05-22
        • 2015-07-01
        • 2013-07-11
        • 2014-06-27
        • 1970-01-01
        • 2022-01-26
        • 1970-01-01
        • 2021-03-21
        相关资源
        最近更新 更多