如何使用 all() 内置函数?

How do I use all() built-in function?

我正在尝试使用 all(),但它对我不起作用:

>>> names = ["Rhonda", "Ryan", "Red Rackham", "Paul"]
>>> all([name for name in names if name[0] == "R"])
True
>>> 

我正在尝试检查是否所有名称都以 "R" 开头,即使我将 "Paul" 添加到 namesall() 仍然是 returns True。我该如何解决这个问题,以便删除 all() returns False 直到 "Paul"

您误解了 all 的工作原理。来自 docs:

all(iterable)

Return True if all elements of the iterable are true (or if the iterable is empty).

在您的代码中,您首先将所有以 R 开头的名称收集到一个列表中,然后将此列表传递给 all。这样做总是 return True 因为非空字符串的计算结果为 True.


相反,你应该这样写:

all(name[0] == "R" for name in names)

这会将一个可迭代的布尔值传递给 all。如果都是True,函数就会returnTrue;否则,它将 return False.

作为一个额外的好处,现在将延迟计算结果,因为我们使用了 generator expression 而不是列表理解。通过列表理解,代码需要在确定结果之前测试 all 个字符串。然而,新代码只会检查必要的数量。

names = ["Rhonda", "Ryan", "Red Rackham", "Paul"]
print all(map(lambda name: name[0] == "R", names))
# prints False
names = ["Rhonda", "Ryan", "Red Rackham"]
print all(map(lambda name: name[0] == "R", names))
# prints True

你得到错误结果的原因是因为你已经通过应用所需的条件使用列表理解创建了一个新列表,所以如果我们做一些细分那么:

>>> print [name for name in names if name[0] == "R"]
>>> ['Rhonda', 'Ryan', 'Red Rackham']
>>> print all(['Rhonda', 'Ryan', 'Red Rackham'])
>>> True

所以正确的方法可能是:

names = ["Rhonda", "Ryan", "Red Rackham", "Paul"]

res = all(map(lambda x : x[0]=="R", names))
# map() returns: [True, True, True, False] 
# all([True, True, True, False]) == False
print res
names = ["Rhonda", "Ryan", "Red Rackham", "Paul"]
if all(c[0] == "R" for c in names):
    print "ALL MATCH"

演示:

http://ideone.com/KenqJl