2017-09-10 1 views
0

J'ai ce code où il faut 2 listes en entrée et imprime la 3ème liste ayant des éléments communs des deux sans doublons.Comment utiliser plusieurs conditions ET dans les listes de compréhensions en python?

Une approche est la boucle commentée qui fonctionne bien et donne le résultat attendu. J'essaie de l'atteindre avec la compréhension de la liste, mais cela donne des doublons.

a = [1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89] 
b = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13] 
c=[] 
# for i in a: 
#  if i in b and i not in c: 
#   c.append(i) 

c = [i for i in a if i in b and i not in c ] 
print c 

résultat escompté: [1, 2, 3, 5, 8, 13]

Résultat courant avec des doubles en utilisant la compréhension de la liste: [1, 1, 2, 3, 5, 8, 13]

J'utilise python 2.7

Répondre

4

une liste ne peut pas s'interroger pendant qu'il est construit dans une compréhension de la liste. La condition i not in c interrogera toujours la même valeur de c (la liste vide []) juste avant l'exécution de votre liste comp, donc votre code ne sait pas ce qui a été inséré dans la dernière itération pendant la suivante.


Option 1

Si l'ordre n'a pas d'importance, vous pouvez simplement effectuer une intersection set:

c = set(a) & set(b) 
print(list(c)) 
[1, 2, 3, 5, 8, 13] # Warning! Order not guaranteed 

Option 2

Si questions d'ordre, utiliser une boucle for:

c = [] 
b = set(b) 
for i in a: 
    if i in b and i not in c: 
     c.append(i) 

print(c) 
[1, 2, 3, 5, 8, 13] 

Option 3

Une version légèrement plus rapide de ce qui précède, qui conserve commande grâce à l'utilisation d'un OrderedDict:

from collections import OrderedDict 

b = set(b) 
c = list(OrderedDict.fromkeys([i for i in a if i in b]).keys()) 
print(c) 
[1, 2, 3, 5, 8, 13]