我希望函数的结果为:
这是我的尝试:
>>> def consistent(x):
... x_filtered = filter(None, x)
... return len(x_filtered) in (0, len(x))
...
>>> consistent((0,1))
False
>>> consistent((1,1))
True
>>> consistent((0,0))
True
[奖金]
该功能应该命名为什么?
答案 0 :(得分:24)
def unanimous(it):
it1, it2 = itertools.tee(it)
return all(it1) or not any(it2)
答案 1 :(得分:11)
def all_bools_equal(lst):
return all(lst) or not any(lst)
答案 2 :(得分:3)
对Ignacio Vasquez-Abram的方法进行捎带,但在第一次不匹配后会停止:
def unanimous(s):
it1, it2 = itertools.tee(iter(s))
it1.next()
return not any(bool(a)^bool(b) for a,b in itertools.izip(it1,it2))
虽然使用not reduce(operators.xor, s)
会更简单,但它不会发生短路。
答案 3 :(得分:2)
def all_equals(xs):
x0 = next(iter(xs), False)
return all(bool(x) == bool(x0) for x in xs)
答案 4 :(得分:0)
不是那么简短,但是没有搞乱'tee'或类似的东西的捷径。
def unanimous(s):
s = iter(s)
if s.next():
return all(s)
else:
return not any(s)
答案 5 :(得分:0)
另一种方法,给出列表l:
sum([int(bool(x)) for x in l]) in (0, len(l))
>>> a=['',None,0,False]
>>> b=[1,True,'ddd']
>>> c=[0,1,False,True,None]
>>> for l in (a,b,c):
... print sum([int(bool(x)) for x in l]) in (0, len(l))
...
True
True
False
答案 6 :(得分:-1)
def AllTheSame(iterable):
return any(iterable) is all(iterable)