繁体   English   中英

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

[英]How to check if a variable matches any item in list using the any() function?

编辑:这就是我想要做的:我要求用户输入一个月。 然后代码将通过检查months_list中的每个项目来查找月份是否正确。 如果没有找到,我希望他/她再次进入月份..

这是代码:

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")

但是,无论是否在列表中找到月份,这都会循环播放.. 我希望这是一个很好的澄清.. 提前谢谢大家

any(a)意思是“任何项目a真实的”? 其结果是True ,因为在每一个项目a是truthy。 (任何非零长度字符串是truthy,并在每一个项目a是一个非零长度的字符串。)

然后您将结果True与比方说"A" True不等于"A"这样比较的结果,当然, False

您可能想要做的是:

"A" in a   # True

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

any(item == "A" for item in a)

这种方法的优点是能够轻松进行不精确的比较( in只会进行精确比较)。 例如:

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)

问题在于,如果可迭代对象中的任何一个元素为True ,则any()返回True ,因此只要答案不等于months_list所有字符串,您的代码就会不断循环——这可能与您的情况相反想要发生。 这是一种使用它的方法,如果答案与任何字符串匹配,则停止或中断循环:

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) ……所以更好(更快)的方法是使用一set更低的 - month_names ,它将利用基于哈希表的查找O(1) ,而不是线性搜索:

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")

进一步细化

根据所涉及的字符串,为什么你比较它们的性质,它可能是最好使用字符串casefold()方法,而不是lower()做了不区分大小写字符串比较。

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

>>> a = ['a','b','c','d']
>>> 'a' in a
True
>>> 'z' in a
False

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM