Я люблю использовать выражение
if 'MICHAEL89' in USERNAMES:
...
где USERNAMES
список.
Есть ли способ сопоставить элементы с нечувствительностью к регистру или мне нужно использовать собственный метод? Просто интересно, есть ли необходимость писать дополнительный код для этого.
python
string
list
case-insensitive
RadiantHex
источник
источник
if 'CaseFudge'.lower() in [x.lower() for x in list]
[...]
создает весь список.(name.upper() for name in USERNAMES)
создаст только генератор и одну нужную строку за раз - огромная экономия памяти, если вы много делаете эту операцию. (еще больше экономии, если вы просто создаете список строчных имен пользователей, которые вы повторно используете для проверки каждый раз)Я бы сделал обертку, чтобы вы не были агрессивными. Минимально, например ...:
Теперь
if CaseInsensitively('MICHAEL89') in whatever:
должен вести себя как требуется (независимо от того, является ли правая часть списком, dict или set). (Это может потребовать больше усилий для достижения аналогичных результатов при включении строк, избегать предупреждений в некоторых случаяхunicode
и т. Д.).источник
CaseInsensitively('MICHAEL89') in {CaseInsensitively('Michael89'):True}
, чтобы это сработало, что, вероятно, не подпадает под «вести себя как требуется».etc.
и «требуют больше усилий» моего ответа ;-).Обычно (по крайней мере, в oop) вы формируете свой объект так, как вам хочется.
name in USERNAMES
не учитывает регистр, поэтомуUSERNAMES
необходимо изменить:Самое замечательное в этом то, что он открывает путь для многих улучшений без необходимости изменения какого-либо кода вне класса. Например, вы можете изменить
self.names
набор на более быстрый поиск или вычислить(n.lower() for n in self.names)
только один раз и сохранить его в классе и так далее ...источник
str.casefold
рекомендуется для сравнения строк без учета регистра. Решение @ nmichaels можно легко адаптировать.Используйте либо:
Или:
Согласно документам :
источник
Вот один из способов:
Для этого , чтобы работать, как
string1
иstring2
объекты должны быть типаstring
.источник
Я думаю, что вы должны написать дополнительный код. Например:
В этом случае мы формируем новый список со всеми записями в
USERNAMES
верхнем регистре и затем сравниваем с этим новым списком.Обновить
Как говорит @viraptor , лучше использовать генератор, чем
map
. См @Nathon «s ответ .источник
itertools
функциюimap
. Это намного быстрее, чем генератор, но выполняет ту же цель.Вы могли бы сделать
Обновление: немного поиграл, и я думаю, что вы могли бы получить лучший подход типа короткого замыкания, используя
ifilter
Функция от itertools, один из моих любимых модулей в Python. Это быстрее, чем генератор, но создает только следующий элемент списка при вызове.источник
Мои 5 (неправильных) центов
ОБНОВИТЬ
Ой, полностью согласен @jpp, я приведу пример плохой практики :(
источник
'a' in "".join(['AB']).lower()
возврате,True
когда это не то, что хочет ОП.Мне нужно было это для словаря вместо списка, решение Jochen было наиболее элегантным для этого случая, поэтому я немного его модифицировал:
Теперь вы можете преобразовать словарь так
USERNAMESDICT = CaseInsensitiveDict(USERNAMESDICT)
и использоватьif 'MICHAEL89' in USERNAMESDICT:
источник
Чтобы это было в одной строке, вот что я сделал:
Хотя я не проверял это время. Я не уверен, насколько это быстро / эффективно.
источник