Python:检查值是否在列表中,无论CaSE如何

时间:2011-03-20 22:18:33

标签: python loops

我想检查一个值是否在列表中,无论字母是什么情况,我都需要有效地进行。

这就是我所拥有的:

if val in list:

但我希望它忽略案例

5 个答案:

答案 0 :(得分:16)

check = "asdf"
checkLower = check.lower()

print any(checkLower == val.lower() for val in ["qwert", "AsDf"])

# prints true

使用any()功能。这个方法很好,因为你没有重新创建小写的列表,它正在遍历列表,所以一旦找到一个真值,它就会停止迭代并返回。

演示:http://codepad.org/dH5DSGLP

答案 1 :(得分:4)

如果您知道自己的值都是strunicode类型,则可以尝试以下操作:

if val in map(str.lower, list):
...Or:
if val in map(unicode.lower, list):

答案 2 :(得分:2)

如果您真的只有一个值列表,那么您可以做的最好就是

if val.lower() in [x.lower() for x in list]: ...

但最好维护一个setdict,其键是列表中值的小写版本;这样你就不需要继续(可能)遍历整个列表了。

顺便说一句,使用list作为变量名称的风格很差,因为list也是Python内置类型之一的名称。您可能会发现自己试图调用list内置函数(将事物转换为列表)并因为list变量无法调用而感到困惑。或者,相反,尝试在恰好超出范围的地方使用list变量,并因为无法索引list内置而感到困惑。

答案 3 :(得分:0)

您可以降低值并检查它们:

>>> val
'CaSe'
>>> l
['caSe', 'bar']
>>> val in l
False
>>> val.lower() in (i.lower() for i in l)
True

答案 4 :(得分:0)

items = ['asdf', 'Asdf', 'asdF', 'asjdflk', 'asjdklflf']
itemset = set(i.lower() for i in items)

val = 'ASDF'
if val.lower() in itemset:  # O(1)
    print('wherever you go, there you are')