编辑:这就是我想要做的: 我要求用户输入一个月。那么代码将通过检查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")
然而,无论是否在列表中找到月份,这都会保持循环。我希望这是一个很好的澄清...提前谢谢大家
答案 0 :(得分:9)
any(a)
表示“a
truthy中的任何项目?”结果是True
,因为a
中的每个项目都是真实的。 (任何非零长度的字符串都是真实的,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)
答案 1 :(得分:8)
问题是any()
会返回True
,如果迭代中的任何一个元素都是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")
答案 2 :(得分:7)
要检查成员资格,请使用in
:
>>> a = ['a','b','c','d']
>>> 'a' in a
True
>>> 'z' in a
False