发电机长度至少为n的Python方式

发电机长度至少为n的Python方式,python,iterable,Python,Iterable,检查iterables长度是否至少为n的Python方法是什么 这是我的方法: import itertools def is_iterable_longer_than(iterable, n): return n <= len(itertools.islice(iterable, n)) 导入itertools def的长度大于(iterable,n): 返回n没有通用的方法。你的甚至不起作用: >>> def is_iterable_longer_than

检查iterables长度是否至少为
n
的Python方法是什么

这是我的方法:

import itertools

def is_iterable_longer_than(iterable, n):
    return n <= len(itertools.islice(iterable, n))
导入itertools
def的长度大于(iterable,n):

返回n没有通用的方法。你的甚至不起作用:

>>> def is_iterable_longer_than(iterable, n):
...     return n <= len(itertools.islice(iterable, n))
...
>>> is_iterable_longer_than([], 2)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "<stdin>", line 2, in is_iterable_longer_than
TypeError: object of type 'itertools.islice' has no len()
如果需要使用iterable的内容,可以创建另一个与原始iterable相似的iterable:

def is_iterable_longer_than(iterable, n):
    iter1, iter2 = itertools.tee(iterable)
    return sum(1 for _ in itertools.islice(iter1, n)) == n, iter2
当我们使用时,我们不妨尝试一下
len
,以防万一:

def is_iterable_longer_than(iterable, n):
    iter1, iter2 = itertools.tee(iterable)
    try:
        return len(iterable) >= n, iter2
    except TypeError:
        return sum(1 for _ in itertools.islice(iter1, n)) == n, iter2

这取决于您是否愿意评估发电机

如果你是,这是微不足道的:

def gen_length_was_at_least_n(gen, n):
    return n == sum(1 for _ in itertools.islice(gen, n))
如果您没有,那么您就被卡住了,除非您愿意对其进行评估,但通过
tee
保留缓冲值:

gen, extra = itertools.tee(gen)
if gen_length_was_at_least_n(extra):
    # ... do something with gen

注意,这会部分计算原始迭代器;它只是保留这些值,并通过从
tee
返回的新生成器提供这些值。这意味着,如果评估生成器有副作用,则在执行长度检查时会触发副作用。

如果不评估生成器中的至少
n
值,则无法执行此操作。@JoelCornett,我知道我需要评估生成器。我想知道最好的方法。显然,我不想评估太多,如果没有中间数据结构就好了。我希望它非常清晰,相当简洁。
def gen_length_was_at_least_n(gen, n):
    return n == sum(1 for _ in itertools.islice(gen, n))
gen, extra = itertools.tee(gen)
if gen_length_was_at_least_n(extra):
    # ... do something with gen