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

时间:2014-04-09 19:00:43

标签: python python-2.x

编辑:这就是我想要做的: 我要求用户输入一个月。那么代码将通过检查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")

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

3 个答案:

答案 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