У меня есть два разных списка с двумя вариантами элементов: «ПОЛОЖИТЕЛЬНЫЙ» и «ОТРИЦАТЕЛЬНЫЙ». Я составил список, чтобы найти несоответствия, но я не могу вернуть индексы с помощью index (), возможно, я использую функцию не в том месте. Я пытаюсь достичь этого, сохраняя понимание списка.

Код

l1 = ['POSITIVE', 'NEGATIVE', 'POSITIVE', 'NEGATIVE', 'POSITIVE', 'NEGATIVE',
           'POSITIVE', 
           'POSITIVE', # mismatch
           'POSITIVE', 
           'POSITIVE'] # mismatch

l2 = ['POSITIVE', 'NEGATIVE', 'POSITIVE', 'NEGATIVE', 'POSITIVE', 'NEGATIVE',
           'POSITIVE', 
           'NEGATIVE', # mismatch
           'POSITIVE', 
           'NEGATIVE'] # mismatch

mismatch = [i for i, j in zip(l1, l2) if i != j]

print(mismatch)
['POSITIVE', 'POSITIVE']

# expected output
[7, 9]
0
Y4RD13 25 Фев 2021 в 01:51

2 ответа

Лучший ответ

i и j перебирают элементы списков, а не индексы. Если вы хотите получить индекс, используйте функцию enumerate в python:

mismatch = [i for i, (a, b) in enumerate(zip(l1, l2)) if a != b]

Вот еще один способ использования range вместо enumerate и zip:

mismatch = [i for i in range(len(l1)) if l1[i] != l2[i]]
2
Jay Mody 24 Фев 2021 в 23:08

Ключ в том, чтобы использовать enumerate(), когда вы хотите перебирать значения и индексы одновременно. Вам действительно не нужен zip() для этого:

mismatch = [i for i,v in enumerate(l1) if v != l2[i]]

Хотя zip() было бы полезно в случаях, когда списки имеют разную длину. Кроме того, условие фильтрации можно описать более четко, как показано в ответе @ JayMody.

2
mhawke 24 Фев 2021 в 23:03