Ответ 1
values = map(compare, new_subjects.values())
len([x for x in values if x]) == len(values) - 1
В принципе, вы фильтруете список для истинных значений и сравниваете длину этого списка с оригиналом, чтобы увидеть, если он меньше.
Я знаю, что
all(map(compare,new_subjects.values()))==True
скажет мне, есть ли каждый элемент списка True. Однако, как я могу определить, является ли каждый элемент, кроме одного из них, True?
values = map(compare, new_subjects.values())
len([x for x in values if x]) == len(values) - 1
В принципе, вы фильтруете список для истинных значений и сравниваете длину этого списка с оригиналом, чтобы увидеть, если он меньше.
Если вы имеете в виду на самом деле 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
Подсчитайте, сколько из них не верно:
values = (compare(val) for val in new_subjects.itervalues())
if sum(1 for x in values if not x) == 1: # just one
...
Предполагая, что функция сравнения возвращает логическую vaue, и зная, что True/False становится 1/0 в целочисленном контексте, вы можете сделать:
values = new_subjects.values()
sum(compare(v) for v in values) == len(values) -1