懒惰的方法来检查所有生成的元素是否相等

时间:2012-10-19 22:04:11

标签: python generator

给定一个产生可比值的迭代器,检查所有结果是否相等的懒惰方法是什么。也就是说,尽快失败,而不消耗整个发电机。因此len(set(g))==1无效。

我正在寻找一个简单的表达式/库函数组合。没有def s。

4 个答案:

答案 0 :(得分:7)

怎么样:

first = next(gen)
if all(x==first for x in gen):
    print "They're all the same!"

(Rob Wouters在评论中描述了这个算法,我只是把它放到Python中)

正如F.J发现的那样,这将在一个空的迭代器上失败,它假设你已经有了一个迭代器,而不仅仅是一个 iterable 。他的回答解决了这两点。

答案 1 :(得分:3)

由@unutbu

给出的表达式
all(y == first for first in gen for y in gen)

测试/演示:

>>> def test(*args):
...     for a in args:
...         print a,
...         yield a
... 
>>> g = test(1,1,1,1,1,1,1)
>>> print all(a == x for a in g for x in g)
1 1 1 1 1 1 1 True
>>> g = test(1,1,1,2,1,1,1)
>>> print all(a == x for a in g for x in g)
1 1 1 2 False

根据需要提前失败。

答案 2 :(得分:2)

def all_equal(iterable):
    itr = iter(iterable)
    try:
        first = next(itr)
    except StopIteration:
        return True
    else:
        return all(item == first for item in itr)
  • 为空的iterables
  • 返回True
  • 适用于任何可迭代的,而不仅仅是生成器

答案 3 :(得分:1)

from itertools import *

if all(a == b for a, b in izip(gen, islice(gen, 1, None))):
    print "They're all the same!"

虽然这对迭代器不起作用。

gen1, gen2 = tee(gen)
next(gen1, None)
if all(a == b for a, b in izip(gen1, gen2)):
    print "They're all the same!"

或者作为“单一表达”:

if (lambda g, h: all(a == b for a, b in izip(g, islice(h, 1, None))))(*tee(gen)):
    print "They're all the same!"