首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何使用any()函数检查变量是否与列表中的任何项匹配?

如何使用any()函数检查变量是否与列表中的任何项匹配?
EN

Stack Overflow用户
提问于 2014-04-10 03:00:43
回答 3查看 58.7K关注 0票数 14

编辑:这是我想要做的:我要求用户输入一个月。然后,代码将通过检查months_list中的每一项来查找月份是否正确。如果找不到,我想让他/她重新输入月份。

代码如下:

代码语言:javascript
运行
复制
months_list=["January", "February", "March", "April", "May", "June", "July"]
answer=raw_input("Month? \n")
while any(item.lower() != answer.lower() for item in months_list):
    print("Sorry, didn't recognize your answer, try again")
    answer=raw_input("Type in Month\n")

但是,无论是否在列表中找到月份,这都会继续循环。我希望这是一个很好的澄清..提前感谢所有人

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2014-04-10 05:14:07

问题是,如果可迭代元素的任何一个为Trueany()就会返回True,所以只要结果不等于months_list-which中的所有字符串,代码就会一直循环,这可能与您希望发生的情况相反。这里有一种使用它的方法,如果答案与任何字符串匹配,它就会停止或中断循环:

代码语言:javascript
运行
复制
months_list = ["January", "February", "March", "April", "May", "June", "July"]

while True:
    answer = raw_input("Month? ")
    if any(item.lower() == answer.lower() for item in months_list): 
        break
    print("Sorry, didn't recognize your answer, try again")

正如其他人所指出的,虽然使用Python的in运算符会更简单,但这种方法仍然会导致线性搜索O(n)被…执行因此,更好(更快)的方法是使用大小写较低的month_namesset,这将利用基于哈希表的查找,O(1),而不是线性搜索:

代码语言:javascript
运行
复制
months = set(month.lower() for month in ("January", "February", "March", "April",
                                         "May", "June", "July"))
while True:
    answer = raw_input("Month? ")
    if answer.lower() in months: 
        break
    print("Sorry, didn't recognize your answer, try again")

进一步细化

根据所涉及的字符串的性质和比较它们的原因,使用string casefold()方法而不是lower()进行无大小写的字符串比较可能更好。

票数 20
EN

Stack Overflow用户

发布于 2014-04-10 03:04:52

any(a)的意思是“a中是否有任何项目是真实的”?结果是True,因为a中的每一项都是真的。(任何非零长度的字符串都是真的,并且a中的每一项都是非零长度的字符串。)

然后将结果True"A"进行比较。True不等于"A",所以比较的结果当然是False

你可能想要这样做:

代码语言:javascript
运行
复制
"A" in a   # True

如果出于某种原因必须使用any(),请尝试:

代码语言:javascript
运行
复制
any(item == "A" for item in a)

这种方法的优点是可以很容易地进行不精确的比较(in只会进行精确的比较)。例如:

代码语言:javascript
运行
复制
any(item.lower() == "a" for item in a)   # case-insensitive
any("a" in item.lower() for item in a)   # substring match
any(item.lower().startswith("a") for item in a)
票数 20
EN

Stack Overflow用户

发布于 2014-04-10 03:04:13

要检查成员资格,请使用in

代码语言:javascript
运行
复制
>>> a = ['a','b','c','d']
>>> 'a' in a
True
>>> 'z' in a
False
票数 12
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/22971667

复制
相关文章

相似问题

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