Python без учета регистра
Я хочу сопоставлять элементы из одного списка в другом, не беспокоясь о чувствительности к регистру.
mylist1 = ['fbH_q1ba8', 'fHh_Q1ba9', 'fbh_q1bA10','hoot']
mylist2 = ['FBH_q1ba8', 'trick','FBH_q1ba9', 'FBH_q1ba10','maj','joe','civic']
Я делал это раньше:
for item in mylist2:
if item in mylist1:
print "true"
else:
print "false"
Но это не удается, потому что он не чувствителен к регистру.
Я знаю о re.match("TeSt", "Test", re.IGNORECASE), но как я могу применить это к моему примеру?
3 ответа
Нормализовать случай с str.lower()
:
for item in mylist2:
print item.lower() in mylist1
in
оператор сдерживания уже возвращает True
или же False
Проще всего распечатать что:
>>> mylist1 = ['fbh_q1ba8', 'fhh_q1ba9', 'fbh_q1ba10','hoot']
>>> mylist2 = ['FBH_q1ba8', 'trick','FBH_q1ba9', 'FBH_q1ba10','maj','joe','civic']
>>> for item in mylist2:
... print item.lower() in mylist1
...
True
False
False
True
False
False
False
Если mylist1
содержит значения в смешанном регистре, вам нужно сделать цикл явным; использовать выражение генератора для получения значений в нижнем регистре; проверка этого гарантирует, что в нижнем регистре будет только столько элементов, сколько необходимо для поиска соответствия:
for item in mylist2:
print item.lower() in (element.lower() for element in mylist1)
демонстрация
>>> mylist1 = ['fbH_q1ba8', 'fHh_Q1ba9', 'fbh_q1bA10','hoot']
>>> for item in mylist2:
... print item.lower() in (element.lower() for element in mylist1)
...
True
False
False
True
False
False
False
Другой подход заключается в использовании any()
:
for item in mylist2:
print any(item.lower() == element.lower() for element in mylist1)
any()
также короткие замыкания; как только True
значение найдено (найден соответствующий элемент), итерация выражения генератора остановлена досрочно. Это должно быть в нижнем регистре item
каждая итерация немного менее эффективна.
Еще одна демка:
>>> for item in mylist2:
... print any(item.lower() == element.lower() for element in mylist1)
...
True
False
False
True
False
False
False
Почему бы просто не сделать:
for item in mylist2:
if item.lower() in [j.lower() for j in mylist1]:
print "true"
else:
print "false"
Это использует .lower()
сделать сравнение, которое дает желаемый результат.
Другие ответы верны. Но они не учитывают смешанные случаи в обоих списках. На всякий случай, если вам это нужно:
mylist1 = ['fbh_q1ba8', 'fbh_q1ba9', 'fbh_q1ba10','hoot']
mylist2 = ['FBH_q1ba8', 'trick','FBH_q1ba9', 'FBH_q1ba10','maj','joe','civic']
for item in mylist2:
found = "false"
for item2 in mylist1:
if item.lower() == item2.lower():
found = "true"
print found