【问题标题】:how to know the number of iterables in a generator in python如何知道python生成器中可迭代的数量
【发布时间】:2013-03-06 22:45:42
【问题描述】:

我有以下代码

>>> x = ['a','b','c','d','e']
>>> def test_yield(lst):
...     for el in lst:
...        yield el
... 
>>> var = test_yield(x)
>>> var.next()
'a'
>>> var.next()
'b'
>>> var.next()
'c'
>>> var.next()
'd'
>>> var.next()
'e'

我如何从生成器中知道可迭代对象的长度(在本例中为列表的长度)。 在我的真实情况下,我没有确切的清单。我从发电机那里得到。简单地说,我想知道在我的第二个 var.next() 左右之后 var 中的可迭代次数。

【问题讨论】:

  • 您在将它们添加到您的集合时不能保持运行计数吗?
  • 我想知道还有多少要添加到集合中,我应该知道我开始时的长度,然后在添加它们时有一个计数器会有所帮助。

标签: python generator yield


【解决方案1】:

你不能。迭代器可以是无限的。

def test_yield():
    count = 1
    while True:
        count += 1
        yield count

【讨论】:

  • 它们也可以是这样的,要弄清楚它们有多长的唯一方法是完全枚举它们,即使它们是有限的。
【解决方案2】:

如果您知道您的迭代器不是无限的(参见@unutbu 的回答),您可以先将结果放入列表中,然后获取长度:

stuff = list(test_yield(x))
print(len(stuff))

【讨论】:

  • 如果我变成一个列表,那么一开始就没有使用生成器的目的吗?当列表很大时,最好通过生成器获取它们,因为它们不会占用太多内存
  • @user1988876 这基本上是正确的,但是函数编写者可能不知道他们的数据将如何被使用,因此从函数返回迭代器并让它们的调用者在必要时转换为列表通常是一种好习惯。
猜你喜欢
  • 2016-10-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-01-27
  • 2015-02-10
  • 2018-11-01
  • 1970-01-01
相关资源
最近更新 更多