Подтвердить что ты не робот

Pythonic способ проверить: все элементы оцениваются в False -OR- все элементы оцениваются в True

Я хочу, чтобы результаты функции были:

  • Все значения оцениваются как False (Нет, 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

[Bonus]

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

4b9b3361

Ответ 1

def unanimous(it):
  it1, it2 = itertools.tee(it)
  return all(it1) or not any(it2)

Ответ 3

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

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) будет проще, он не закорачивает.

Ответ 4

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

Ответ 5

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

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

Ответ 6

def AllTheSame(iterable):
    return any(iterable) is all(iterable)