J'ai deux listes différentes avec deux variantes d'éléments: «POSITIF» et «NÉGATIF». J'ai fait une compréhension de liste pour trouver des incohérences, mais je ne peux pas renvoyer les index en utilisant index (), peut-être que j'utilise la fonction au mauvais endroit. J'essaie d'accomplir cela en gardant la compréhension de la liste.

Code

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 févr. 2021 à 01:51

2 réponses

Meilleure réponse

i et j itèrent sur les éléments des listes, pas sur les indices. Si vous souhaitez obtenir l'index, utilisez la fonction enumerate en python:

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

Voici une autre façon d'utiliser range au lieu de enumerate et zip:

mismatch = [i for i in range(len(l1)) if l1[i] != l2[i]]
2
Jay Mody 24 févr. 2021 à 23:08

La clé est d'utiliser enumerate() lorsque vous souhaitez parcourir des valeurs et des index en même temps. Vous n'avez pas vraiment besoin de zip() pour cela:

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

Bien que zip() serait utile dans les cas où les listes sont de longueurs différentes. La condition du filtre peut également être écrite plus clairement comme indiqué dans la réponse de @ JayMody.

2
mhawke 24 févr. 2021 à 23:03