我正在尝试使用all(),但它并不适用于我:
>>> 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"被移除?
发布于 2015-05-04 16:36:05
您误解了all的工作原理。来自文档
all(iterable)如果True的所有元素都是true (或者如果iterable是空的),则返回iterable。
在代码中,首先将以R开头的所有名称收集到列表中,然后将此列表传递给all。这样做总是会返回True,因为非空字符串的计算结果为True。
相反,你应该写:
all(name[0] == "R" for name in names)这将将布尔值的可迭代传递给all。如果它们都是True,则函数将返回True;否则,它将返回False。
作为额外的奖励,结果现在将被延迟计算,因为我们使用的是生成器表达式而不是列表理解。使用列表理解,在确定结果之前,需要测试所有字符串的代码。但是,新代码只会检查尽可能多的代码。
发布于 2015-05-04 16:36:17
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发布于 2015-05-04 16:37:11
您之所以得到错误的结果,是因为您已经通过应用所需的条件创建了一个使用列表理解的新列表,因此,如果我们做了一些细分,那么:
>>> 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 reshttps://stackoverflow.com/questions/30035163
复制相似问题