1258 votes

Obtenez de différence entre les deux listes

J'ai deux listes en Python, comme celles-ci:

temp1 = ['One', 'Two', 'Three', 'Four']
temp2 = ['One', 'Two']

J'ai besoin de créer une troisième liste avec des éléments de la première liste qui ne sont pas présents dans le second. À partir de l'exemple-je obtenir:

temp3 = ['Three', 'Four']

Existe-il des moyens rapides sans cycles et de vérification?

1808voto

ars Points 35803
In [5]: list(set(temp1) - set(temp2))
Out[5]: ['Four', 'Three']

657voto

Mark Byers Points 318575

Les solutions existantes offrent tous un ou l'autre de:

  • Plus rapide que O(n*m) de la performance.
  • Préserver l'ordre de la liste d'entrée.

Mais jusqu'à présent, aucune solution n'a la fois. Si vous souhaitez à la fois, essayez ceci:

s = set(temp2)
temp3 = [x for x in temp1 if x not in s]

Test de Performance

import timeit
init = 'temp1 = list(range(100)); temp2 = [i * 2 for i in range(50)]'
print timeit.timeit('list(set(temp1) - set(temp2))', init, number = 100000)
print timeit.timeit('s = set(temp2);[x for x in temp1 if x not in s]', init, number = 100000)
print timeit.timeit('[item for item in temp1 if item not in temp2]', init, number = 100000)

Résultats:

4.34620224079 # ars' answer
4.2770634955  # This answer
30.7715615392 # matt b's answer

La méthode que j'ai présenté ainsi que le maintien de l'ordre est aussi (un peu) plus vite que l'ensemble de la soustraction car elle ne nécessite pas la construction d'une inutiles ensemble. La différence de performances serait plus perceptible si la première liste est beaucoup plus longue que la deuxième, et si le hachage est cher. Voici un deuxième test de le démontrer:

init = '''
temp1 = [str(i) for i in range(100000)]
temp2 = [str(i * 2) for i in range(50)]
'''

Résultats:

11.3836875916 # ars' answer
3.63890368748 # this answer (3 times faster!)
37.7445402279 # matt b's answer

141voto

matt b Points 73770
temp3 = [item for item in temp1 if item not in temp2]

30voto

arulmr Points 2768

La différence entre les deux listes (dire list1 et list2) peut être trouvé à l'aide de la fonction suivante.

def diff(list1, list2):
    c = set(list1).union(set(list2))
    d = set(list1).intersection(set(list2))
    return list(c - d)

À l'Aide de la fonction ci-dessus, la différence peut être trouvé à l'aide de diff(temp2, temp1) ou diff(temp1, temp2). Les deux donnent le résultat ['Four', 'Three']. Vous n'avez pas à vous soucier de l'ordre de la liste ou la liste est donnée en premier.

19voto

aaronasterling Points 25749

je vais jeter dans car aucun de présenter des solutions de rendement d'un n-uplet:

temp3 = tuple(set(temp1) - set(temp2))

sinon:

#edited using @Mark Byers idea. If you accept this one as answer, just accept his instead.
temp3 = tuple(x for x in temp1 if x not in set(temp2))

Comme les autres non-tuple de rendement des réponses dans ce sens, il préserve l'ordre

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