给定一个产生可比值的迭代器,检查所有结果是否相等的懒惰方法是什么。也就是说,尽快失败,而不消耗整个发电机。因此len(set(g))==1
无效。
我正在寻找一个简单的表达式/库函数组合。没有def
s。
答案 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)
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!"