我知道
all(map(compare,new_subjects.values()))==True
会告诉我列表中的每个元素是否为True。但是,如何判断除其中一个元素之外的每个元素是否为True?
答案 0 :(得分:11)
values = map(compare, new_subjects.values())
len([x for x in values if x]) == len(values) - 1
基本上,您过滤列表中的真值,并将该列表的长度与原始列表进行比较,以查看它是否少一个。
答案 1 :(得分:7)
如果你的意思是实际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
>>>
编辑:这实际上更好地回答了您的问题:
>>> 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
答案 2 :(得分:3)
计算有多少不是真的:
values = (compare(val) for val in new_subjects.itervalues())
if sum(1 for x in values if not x) == 1: # just one
...
答案 3 :(得分:0)
假设compare函数返回一个布尔值,并且在整数上下文中知道True / False变为1/0,您可以这样做:
values = new_subjects.values()
sum(compare(v) for v in values) == len(values) -1