Python: проверьте, есть ли значение в списке, независимо от того, CaSE - PullRequest
10 голосов
/ 21 марта 2011

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

Вот что у меня есть:

if val in list:

Но я хочу игнорировать регистр

Ответы [ 5 ]

16 голосов
/ 21 марта 2011
check = "asdf"
checkLower = check.lower()

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

# prints true

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

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

4 голосов
/ 21 марта 2011

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

if val in map(str.lower, list):
...Or:
if val in map(unicode.lower, list):
2 голосов
/ 21 марта 2011

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

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

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

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

0 голосов
/ 21 марта 2011
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')
0 голосов
/ 21 марта 2011

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

>>> val
'CaSe'
>>> l
['caSe', 'bar']
>>> val in l
False
>>> val.lower() in (i.lower() for i in l)
True
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...