2010-11-30 12 views
11

Я хочу результаты функции быть:Pythonic способ проверить: все элементы оценки на Ложное -или- все элементы оценки Истинных

  • Все значения вычисляются в FALSE (None, 0, пустая строка) -> True
  • Все значения оценки в True -> True
  • Каждый другой случай -> False

Это моя попытка на него:

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

[Бонус]

Что следует назвать этой функцией?

ответ

23
def unanimous(it): 
    it1, it2 = itertools.tee(it) 
    return all(it1) or not any(it2) 
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

+0

опередил меня - я решил проверить это первый (и как раз собирался к нам лямбда – Gerrat 2010-11-30 05:17:42

+0

... упс не видел бонус – Gerrat 2010-11-30 05:18:08

+4

@Gerrat - если только StackOverflow был интерпретатор Python построить в поле ответа ;-) – dkamins 2010-11-30 05:20:21

-1
def AllTheSame(iterable): 
    return any(iterable) is all(iterable) 
2

Спекуляция по методу Игнасио Васкес-Аврама, но остановится после первого несовпадения:

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

While используя not reduce(operators.xor, s) будет проще, он не замыкается.

1
def all_equals(xs): 
    x0 = next(iter(xs), False) 
    return all(bool(x) == bool(x0) for x in xs) 
0

Не так кратко, но ярлыки, не вмешивающиеся в «тройник» или что-то в этом роде.

def unanimous(s): 
    s = iter(s) 
    if s.next(): 
     return all(s) 
    else: 
     return not any(s)