【问题标题】:Find the length of the generator or Does it have an element求生成器的长度或是否有元素
【发布时间】:2021-04-01 00:47:58
【问题描述】:

您好,我有如下代码:

isEmpty = True
for itrat in  generator():
    isEmpty = False
    break
if isEmpty:
    doSomething()
else:
    dosomethingelse()

测试我在 Generator 中是否有 One 或 mode 元素,或者更确切地说,如果生成器 length > 0 做某事, 但我想要一个 cleaner 代码来显示我们的 Generator 是否有元素,我不需要获取 generators 结果的所有值,只知道它是否有元素

生成器没有长度:

【问题讨论】:

  • generator() 到底是什么?你试过用 len(generator()) 吗?

标签: python iterator iteration generator


【解决方案1】:

如果不消耗至少一项,就无法确定通用迭代器是否为空。一种解决方法可以采用以下方式:

from itertools import chain

def empty_check(gen):
    try:
        x = next(gen)
        return chain([x], gen), False
    except StopIteration:
        return gen, True

gen, empty = empty_check(generator())
if empty:
    # do something 
else:
    # do something else with still complete gen

【讨论】:

    【解决方案2】:

    您可以使用 len(generator)。

    n=sum(1 for x in generator())
    
    if n==0:
        dosomething()
    else:
        dosomethingelse()
    

    【讨论】:

    • 不,你不能。试试len(iter([])) 例如
    • 对不起,我的错误,我已经更新了我的解决方案,请再次检查
    • 请注意,这会耗尽生成器。所以你知道它以前的长度,但现在它是空的:)
    • @IoaTzimas 如果使用生成器本身不是问题,至少使用像empty = not any(1 for _ in generator()) 这样的短路逻辑。想想像itertools.count 这样的无限生成器。
    【解决方案3】:
    from more_itertools import peekable
    
    if peekable([]):
        print('ok')
    else:
        print('not ok')
    

    【讨论】:

      猜你喜欢
      • 2022-11-17
      • 2015-06-10
      • 2013-08-03
      • 2012-01-25
      • 2021-02-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多