Python: проверьте, включено ли значение в списке, независимо от того, какой CaSE

Я хочу проверить, есть ли значение в списке, независимо от того, что у вас есть, и мне нужно сделать это эффективно.

Это то, что у меня есть:

if val in list:

Но я хочу, чтобы он игнорировал случай

Ответ 1

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

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

# prints true

Используя функцию any(). Этот метод хорош, потому что вы не воссоздаете список, чтобы иметь строчный регистр, он выполняет итерацию по списку, поэтому, когда он находит истинное значение, он прекращает итерацию и возвращает.

Демо: http://codepad.org/dH5DSGLP

Ответ 2

Если вы знаете, что ваши значения имеют тип str или unicode, вы можете попробовать следующее:

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

Ответ 3

Если у вас действительно есть список значений, лучшее, что вы можете сделать, это что-то вроде

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

но, вероятно, было бы лучше поддерживать, скажем, set или dict, чьими ключами являются строчные версии значений в списке; таким образом вам не нужно будет продолжать перебирать (потенциально) весь список.

Кстати, использование list в качестве имени переменной плохое, потому что list также является именем одного из встроенных типов Python. Вы можете попытаться вызвать встроенную функцию list (которая превращает вещи в списки) и запутаться, потому что ваша переменная list не может быть вызвана. Или, наоборот, вы пытаетесь использовать переменную list где-то там, где она оказывается вне области видимости и запутывается, потому что вы не можете индексировать ее в list.

Ответ 4

Вы можете снизить значения и проверить их:

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

Ответ 5

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')