编辑:这是我想要做的:我要求用户输入一个月。然后,代码将通过检查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")但是,无论是否在列表中找到月份,这都会继续循环。我希望这是一个很好的澄清..提前感谢所有人
发布于 2014-04-10 05:14:07
问题是,如果可迭代元素的任何一个为True,any()就会返回True,所以只要结果不等于months_list-which中的所有字符串,代码就会一直循环,这可能与您希望发生的情况相反。这里有一种使用它的方法,如果答案与任何字符串匹配,它就会停止或中断循环:
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_names的set,这将利用基于哈希表的查找,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")进一步细化
根据所涉及的字符串的性质和比较它们的原因,使用string casefold()方法而不是lower()进行无大小写的字符串比较可能更好。
发布于 2014-04-10 03:04:52
any(a)的意思是“a中是否有任何项目是真实的”?结果是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)发布于 2014-04-10 03:04:13
要检查成员资格,请使用in
>>> a = ['a','b','c','d']
>>> 'a' in a
True
>>> 'z' in a
Falsehttps://stackoverflow.com/questions/22971667
复制相似问题