Si vous voulez un one-liner solution (en ignorant les importations) qui ne nécessite qu' O(max(n, m))
de travail pour les entrées de longueur n
et m
, pas O(n * m)
de travail, vous pouvez le faire avec l' itertools
module de:
from itertools import filterfalse
main_list = list(filterfalse(set(list_1).__contains__, list_2))
Cette méthode tire parti de la fonctionnelle de fonctions une fonction de rappel de la construction, afin de créer la fonction de rappel une fois et de le réutiliser pour chaque élément, sans avoir besoin de le stocker quelque part (parce qu' filterfalse
magasins en interne); interprétations de la liste et le générateur d'expressions peut le faire, mais c'est moche.†
Qui obtient les mêmes résultats en une seule ligne:
main_list = [x for x in list_2 if x not in list_1]
avec la vitesse de:
set_1 = set(list_1)
main_list = [x for x in list_2 if x not in set_1]
Bien sûr, si les comparaisons sont destinés à être de position, de sorte que:
list_1 = [1, 2, 3]
list_2 = [2, 3, 4]
doit produire:
main_list = [2, 3, 4]
(parce que la valeur en list_2
a un match à la même indice en list_1
), vous devriez certainement aller avec Patrick réponse, ce qui n'implique pas de temporaire list
s ou set
s (même avec set
s d'être à peu près O(1)
, ils ont plus de "constante" facteur par vérifier que de simples contrôles d'égalité) et implique O(min(n, m))
le travail, moins que toute autre réponse, et si votre problème est sensible à la position, est la seule correcte de la solution lors de l'appariement des éléments apparaissent à incompatibles décalages.
†: La façon de faire la même chose avec une compréhension de liste comme un one-liner serait de l'abus de boucle imbriquée pour créer et mettre en cache les valeur(s) dans la "ultrapériphériques" de la boucle, par exemple:
main_list = [x for set_1 in (set(list_1),) for x in list_2 if x not in set_1]
qui donne également un mineur avantage de performance sur Python 3 (parce que maintenant, en set_1
est configuré localement dans la compréhension du code, plutôt que d'leva les yeux de imbriquée à la portée de chaque case; sur Python 2 qui n'a pas d'importance, parce que Python 2 ne pas utiliser des fermetures pour les interprétations de la liste; ils fonctionnent de la même portée, ils sont utilisés dans des).