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
Другие вопросы по тегам