Я хочу проверить, есть ли значение в списке, независимо от того, что у вас есть, и мне нужно сделать это эффективно.
Это то, что у меня есть:
if val in list:
Но я хочу, чтобы он игнорировал случай
Я хочу проверить, есть ли значение в списке, независимо от того, что у вас есть, и мне нужно сделать это эффективно.
Это то, что у меня есть:
if val in list:
Но я хочу, чтобы он игнорировал случай
check = "asdf"
checkLower = check.lower()
print any(checkLower == val.lower() for val in ["qwert", "AsDf"])
# prints true
Используя функцию any(). Этот метод хорош, потому что вы не воссоздаете список, чтобы иметь строчный регистр, он выполняет итерацию по списку, поэтому, когда он находит истинное значение, он прекращает итерацию и возвращает.
Если вы знаете, что ваши значения имеют тип str
или unicode
, вы можете попробовать следующее:
if val in map(str.lower, list):
...Or:
if val in map(unicode.lower, list):
Если у вас действительно есть список значений, лучшее, что вы можете сделать, это что-то вроде
if val.lower() in [x.lower() for x in list]: ...
но, вероятно, было бы лучше поддерживать, скажем, set
или dict
, чьими ключами являются строчные версии значений в списке; таким образом вам не нужно будет продолжать перебирать (потенциально) весь список.
Кстати, использование list
в качестве имени переменной плохое, потому что list
также является именем одного из встроенных типов Python. Вы можете попытаться вызвать встроенную функцию list
(которая превращает вещи в списки) и запутаться, потому что ваша переменная list
не может быть вызвана. Или, наоборот, вы пытаетесь использовать переменную list
где-то там, где она оказывается вне области видимости и запутывается, потому что вы не можете индексировать ее в list
.
Вы можете снизить значения и проверить их:
>>> val
'CaSe'
>>> l
['caSe', 'bar']
>>> val in l
False
>>> val.lower() in (i.lower() for i in l)
True
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')