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

2024-06-26 14:06:24 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在尝试使用^{},但它对我无效:

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

我试图检查是否所有的名字都以"R"开头,即使我将"Paul"添加到names,但all()仍然返回True。如何修复此问题,使all()返回False,直到"Paul"被删除?你知道吗


Tags: nameinfalsetrueforifnamesred
3条回答
names = ["Rhonda", "Ryan", "Red Rackham", "Paul"]
if all(c[0] == "R" for c in names):
    print "ALL MATCH"

演示:

http://ideone.com/KenqJl

你误解了all的工作原理。从docs

all(iterable)

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

在代码中,首先将以R开头的所有名称收集到一个列表中,然后将该列表传递给all。这样做将始终返回True,因为非空字符串的值为True。你知道吗


相反,你应该写:

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

这将把一个布尔数传递给all。如果它们都是True,函数将返回True;否则,它将返回False。你知道吗

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

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

相关问题 更多 >