Каждый элемент списка имеет значение True boolean

Я знаю, что

all(map(compare,new_subjects.values()))==True

скажет мне, есть ли каждый элемент списка True. Однако, как я могу определить, является ли каждый элемент, кроме одного из них, True?

Ответы

Ответ 1

values = map(compare, new_subjects.values())
len([x for x in values if x]) == len(values) - 1

В принципе, вы фильтруете список для истинных значений и сравниваете длину этого списка с оригиналом, чтобы увидеть, если он меньше.

Ответ 2

Если вы имеете в виду на самом деле True и не оцениваете значение True, вы можете просто посчитать их?

>>> L1 = [True]*5
>>> L1
[True, True, True, True, True]
>>> L2 = [True]*5 + [False]*2
>>> L2
[True, True, True, True, True, False, False]
>>> L1.count(False)
0
>>> L2.count(False)
2
>>> 

проверка только одного False:

>>> def there_can_be_only_one(L):
...     return L.count(False) == 1
... 
>>> there_can_be_only_one(L1)
False
>>> there_can_be_only_one(L2)
False
>>> L3 = [ True, True, False ]
>>> there_can_be_only_one(L3)
True
>>> 

edit:. На самом деле лучше ответьте на ваш вопрос:

>>> def there_must_be_only_one(L):
...     return L.count(True) == len(L)-1
... 
>>> there_must_be_only_one(L3)
True
>>> there_must_be_only_one(L2)
False
>>> there_must_be_only_one(L1)
False

Ответ 3

Подсчитайте, сколько из них не верно:

values = (compare(val) for val in new_subjects.itervalues())
if sum(1 for x in values if not x) == 1: # just one
    ...

Ответ 4

Предполагая, что функция сравнения возвращает логическую vaue, и зная, что True/False становится 1/0 в целочисленном контексте, вы можете сделать:

values = new_subjects.values()
sum(compare(v) for v in values) == len(values) -1