首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何使用所有()内置函数?

问如何使用所有()内置函数?
EN

Stack Overflow用户
提问于 2015-05-04 16:33:30
回答 4查看 66关注 0票数 2

我正在尝试使用all(),但它并不适用于我:

代码语言:javascript
复制
>>> 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"被移除?

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2015-05-04 16:36:05

您误解了all的工作原理。来自文档

all(iterable) 如果True的所有元素都是true (或者如果iterable是空的),则返回iterable。

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

相反,你应该写:

代码语言:javascript
复制
all(name[0] == "R" for name in names)

这将将布尔值的可迭代传递给all。如果它们都是True,则函数将返回True;否则,它将返回False。

作为额外的奖励,结果现在将被延迟计算,因为我们使用的是生成器表达式而不是列表理解。使用列表理解,在确定结果之前,需要测试所有字符串的代码。但是,新代码只会检查尽可能多的代码。

票数 8
EN

Stack Overflow用户

发布于 2015-05-04 16:36:17

代码语言:javascript
复制
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
票数 0
EN

Stack Overflow用户

发布于 2015-05-04 16:37:11

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

代码语言:javascript
复制
>>> print [name for name in names if name[0] == "R"]
>>> ['Rhonda', 'Ryan', 'Red Rackham']
>>> print all(['Rhonda', 'Ryan', 'Red Rackham'])
>>> True

所以正确的方法可能是:

代码语言:javascript
复制
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
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/30035163

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档