Python 如何使用all()内置函数?
我正在尝试使用,但它对我无效:Python 如何使用all()内置函数?,python,python-2.7,python-2.x,Python,Python 2.7,Python 2.x,我正在尝试使用,但它对我无效: >>> names = ["Rhonda", "Ryan", "Red Rackham", "Paul"] >>> all([name for name in names if name[0] == "R"]) True >>> 我试图检查所有名称是否都以“R”开头,即使我在名称中添加了“Paul”,all()仍然返回True。如何修复此问题,使all()返回False,直到“Paul”被删除?您误解了al
>>> names = ["Rhonda", "Ryan", "Red Rackham", "Paul"]
>>> all([name for name in names if name[0] == "R"])
True
>>>
我试图检查所有名称是否都以
“R”
开头,即使我在名称中添加了“Paul”
,all()
仍然返回True
。如何修复此问题,使all()
返回False
,直到“Paul”
被删除?您误解了all
的工作原理。从:
all(可编辑)
如果iterable
的所有元素均为True(或者如果
iterable
为空)
在代码中,首先将以R
开头的所有名称收集到一个列表中,然后将该列表传递给all
。执行此操作将始终返回True
,因为非空字符串的计算结果为True
相反,你应该写:
all(name[0] == "R" for name in names)
这将把布尔数的iterable传递给all
。如果全部为True
,则函数将返回True
;否则,它将返回False
作为一个额外的好处,现在将延迟计算结果,因为我们使用了一个而不是一个列表。使用列表理解,代码需要在确定结果之前测试所有字符串。然而,新代码将只检查必要的数量 您得到错误结果的原因是,您已经通过应用所需的条件,使用列表理解创建了一个新列表,因此,如果我们进行一些细分,那么:
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
演示:
您期望的是什么?旁白:字符串有一个startswith
方法,因此name.startswith(“R”)
也可以工作。如果全部(c[0]==“R”表示名称中的c):
谢谢!我试图在all
:)中添加一个评估列表
names = ["Rhonda", "Ryan", "Red Rackham", "Paul"]
if all(c[0] == "R" for c in names):
print "ALL MATCH"