503 votes

Supprimer tous les éléments qui se produisent dans 1 liste à partir d'un autre

Disons que j'ai deux listes, l1 et l2. Je veux réaliser des l1 - l2, ce qui renvoie l1 avec tous les éléments qui sont aussi des éléments de l2 supprimé.

Je pense à une naïve boucle approche pour le faire, mais qui va être très inefficace. Qu'est ce qu'un pythonic et efficace de faire cela?

Par exemple, si j'ai l1 = [1,2,6,8] and l2 = [2,3,5,8], l1 - l2 doit renvoyer [1,6]

665voto

Donut Points 32892

Python est un langage de fonctionnalité appelée Interprétations de la Liste qui est parfaitement adapté pour faire ce genre de chose extrêmement facile. La déclaration suivante est exactement ce que vous voulez et stocke le résultat dans l3:

l3 = [x for x in l1 if x not in l2]

l3 contiendra [1, 6].

Espérons que cette aide!

211voto

Arkku Points 15523

Une façon est d'utiliser des ensembles:

>>> set([1,2,6,8]) - set([2,3,5,8])
set([1, 6])

32voto

Daniel Pryden Points 22167

L'expansion sur le Donut de la réponse et de l'autre les réponses ici, vous pouvez obtenir de meilleurs résultats en utilisant un générateur de compréhension au lieu d'une compréhension de liste, et à l'aide d'un set structure de données (depuis l' in opérateur est O(n) sur une liste, mais O(1) sur un ensemble).

Alors, voici une fonction qui travaillent pour vous:

def filter_list(full_list, excludes):
    s = set(excludes)
    return (x for x in full_list if x not in s)

Le résultat sera un objet iterable qui paresseusement récupérer la liste filtrée. Si vous avez besoin d'un réel objet de la liste (par exemple, si vous avez besoin de faire un len() sur le résultat), alors vous pouvez facilement construire une liste comme suit:

filtered_list = list(filter_list(full_list, excludes))

32voto

nonot1 Points 1096

Utiliser le Python type de jeu. Qui serait le plus Pythonic. :)

Aussi, puisqu'il est natif, il devrait être la méthode la plus optimisée.

Voir:

http://docs.python.org/library/stdtypes.html#set

http://docs.python.org/library/sets.htm (pour les anciens python)

# Using Python 2.7 set literal format.
# Otherwise, use: l1 = set([1,2,6,8])
#
l1 = {1,2,6,8}
l2 = {2,3,5,8}
l3 = l1 - l2

Cela devrait faire l'affaire.

A cette réponse à votre question? Merci.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X