Сравнение строк с символом, который не волнует (игнорировать)

#python #python-3.x #string

#python #python-3.x #строка

Вопрос:

У меня есть два списка: список golden строк и measured список строк. Я должен сравнивать эти списки элемент за элементом.

Строки имеют точно такую же длину. В золотых строках есть символы, которые отмечены 'X' , и их не следует учитывать при сравнении.

Например:

 Golden = [
    '023XX1FD', 'FEBFF1B6', 'XXXXXXXX', '????????', '00000XXX', 
    '00000000', '00000000', '00000000', '00000800'
]

Measured = [
    '0236C1FD', 'FEBFF1B6', '00F1FC3F', '????????', '00000000', 
    '00000000', '00000000', '00000000', '00000800'
]
  

и сравнение '023XX1FD' с '0236C1FD' должно возвращать true, поскольку мы должны сравнивать только те части, которые не равны 'X' в золотой строке.

В этом примере вывод выполняется True для каждой строки.

Комментарии:

1. Итак, каков ваш желаемый результат?

2. Я сравниваю два списка элемент за элементом, и для каждого сравнения я должен получить значение true или false.

Ответ №1:

Вы можете определить свою собственную функцию сравнения строк, чтобы перебирать символы один за другим и сравнивать их, при условии, что золотой символ не является значением «Don’t Care»:

 def myStringCompare(golden, measured, dont_care="X"):
    return (
        (len(golden) == len(measured)) and 
        all(g == m for g, m in zip(golden, measured) if g != dont_care)
    )
  

Затем используйте эту функцию для понимания списка:

 print([myStringCompare(a, b) for a, b in zip(Golden, Measured)])
#[True, True, True, True, True, True, True, True, True]
  

Ответ №2:

Вы можете использовать

 [all(char1 == 'X' or char1 == char2 for char1, char2 in zip(str1, str2)) for str1, str2 in zip(list1, list2)]
  

Ответ №3:

Я смог прийти к следующему пониманию списка:

 result_list = [
    all(
        [
            symbol == b[list_index][symbol_index]
            for symbol_index, symbol in enumerate(item)
            if symbol != "X"
        ]
    )
    for list_index, item in enumerate(a)
]


> [True, True, True, True, True, True, True, True, True]