[英]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.