列表中的每个元素都是True布尔值。

21

我知道

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

告诉我如何判断列表中的每个元素是否都为True。但是,如果除了其中一个元素外,其他所有元素都是True,我该如何判断?


1
我不是很懂Python,但你为什么不能只扫描列表并计算有多少个元素是真的,然后如果你只找到一个答案就是“是”,否则就是“否”呢?这些通常是你在学习编程基础的前2-3个月写的函数。即使我不懂Python,我也很确定没有“除了其中一个元素外,其他所有元素都是True”的自动化函数... - gd1
@Giacomo,这里没有函数,但可以用一行代码实现。 - Rafe Kettler
4个回答

12
values = map(compare, new_subjects.values())
len([x for x in values if x]) == len(values) - 1
基本上,您需要过滤列表中的True值,并比较该列表的长度与原始列表的长度是否相差1。

1
@Giacomo 我会在实践中使用注释来配合它。列表推导式对外行人来说看起来有点奇怪,但一旦你习惯了它们,它们就非常好用。 - Rafe Kettler
1
@Rafe,这真的取决于情况。当你来自函数式编程背景时,使用“filter”会有很多意义。 - Mike Lewis
1
filter(None, values) 做的是同样的事情 ;p - Jochen Ritzel
5
@Giacomo: 列表推导式是一项强大的功能,如果你学习任何Python,很快就会学到它们。我不会仅仅因为C程序员理解困难而限制我代码中使用的功能。当你尝试阅读语言L的代码时,你必须了解一些L的知识。 - user395760
2
但是列表推导式很简单。每个了解它们并使用它们几天的人都能理解它们。正如我之前所说,它们不是一个晦涩的特性,在完全可读的Python代码中非常常见。而且,不,你的代码(无论是PHP还是其他语言)对任何人来说都不易懂。如果他们习惯于完全不同的语言,甚至可能连所有程序员也不理解。除此之外,您能否避免为此目的使用例如字符串插值? - user395760
显示剩余6条评论

7
如果你的意思是实际上是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
>>> 

编辑:实际上这更好地回答了你的问题:

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

4

计算有多少个不是True的值:

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

0
假设比较函数返回一个布尔值,并且知道在整数上下文中True/False变成1/0,您可以这样做:
values = new_subjects.values()
sum(compare(v) for v in values) == len(values) -1

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接