Pythonic方法检查是否:所有元素评估为False -OR-所有元素评估为True

时间:2010-11-30 05:14:07

标签: python

我希望函数的结果为:

  • 所有值评估为False(无,0,空字符串) - >真
  • 所有值评估为True - >真
  • 其他案例 - >假

这是我的尝试:

>>> 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

[奖金]

该功能应该命名为什么?

7 个答案:

答案 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)

请参阅:http://docs.python.org/library/functions.html#all

请参阅:http://docs.python.org/library/functions.html#any

答案 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)