2009-06-30 6 views
2

Prenez deux listes, deuxième avec mêmes éléments que la première, plus quelques-uns:Obtenir les articles ne se répètent pas dans une liste

a = [1,2,3] 
b = [1,2,3,4,5] 

Je veux obtenir un troisième, ne contenant que les nouveaux éléments (ceux ne se répète pas):

c = [4,5] 

La solution que j'ai droit est maintenant:

>>> c = [] 
>>> for i in ab: 
... if ab.count(i) == 1: 
...  c.append(i) 
>>> c 
[4, 5] 

est-il une autre façon plus pythonique que cela?

Merci à tous!

Répondre

12

au moins utiliser une compréhension de la liste:

[x for x in a + b if (a + b).count(x) == 1] 

utiliser autrement la set classe:

list(set(a).symmetric_difference(set(b))) 

il y a aussi une forme plus compacte:

list(set(a)^set(b)) 
+0

Si le code sera lu par quelqu'un d'autre, qui peuvent ou peuvent ne pas être trop familier avec python, la deuxième option est meilleure que la troisième en ce sens qu'elle est plus lisible.A moins que tous ceux qui lisent votre code aient mémorisé les opérateurs 'set', c'est-à-dire ... – tgray

8

Si la l'ordre n'est pas important et vous pouvez ignorer les répétitions au sein de a et b, je voudrais simplement utiliser des ensembles:

>>> set(b) - set(a) 
set([4, 5]) 

Les ensembles sont itératives, donc la plupart du temps, vous n'avez pas besoin de les convertir explicitement Retour à la liste. Si vous devez, cela il:

>>> list(set(b) - set(a)) 
[4, 5] 
+0

Le seul problème de cette solution est qu'elle ignore les éléments qui n'apparaissent que dans set (a), vous voulez probablement la symmetric_difference. – tgray

+0

La différence symétrique vous trouve les éléments dans a qui ne sont pas dans b ou ceux dans b qui ne sont pas dans a. À moins que je ne me trompe, nabucosound demande les éléments qui ont été ajoutés dans b qui n'étaient pas dans a. Ainsi, la simple différence de réglage semble suffisante. – krawyoti

4

articles en b qui ne sont pas dans un, si vous avez besoin de préserver l'ordre ou les doublons en b:

>>> a = [1, 2, 3] 
>>> b = [1, 2, 3, 4, 4, 5] 
>>> a_set = set(a) 
>>> [x for x in b if x not in a_set] 
[4, 4, 5] 

articles en b qui aren » t dans un, et non la préservation de l'ordre, et non la préservation de doublons dans b:

>>> list(set(b) - set(a)) 
[4, 5] 
3

Je dirais aller pour la variante de jeu, où

set(b)^set(a) (set.symmetric_difference()) 

s'applique uniquement si vous pouvez être certain que a est toujours un sous-ensemble de b, mais dans ce cas a l'avantage d'être commutatif, c'est à dire. vous n'avez pas à vous préoccuper du calcul de l'ensemble (b)^de l'ensemble (a) ou de l'ensemble (a)^de l'ensemble (b); ou

set(b) - set(a) (set.difference()) 

qui correspond à votre description plus près, permet un d'avoir des éléments supplémentaires ne sont pas en b qui ne sera pas dans le jeu de résultats, mais vous avez à l'esprit l'ordre (ensemble (a) - ensemble (b) vous donnera un résultat différent).

0

Une autre solution utilisant des listes seulement:

a = [1, 2, 3] 
b = [1, 2, 3, 4, 5] 
c = [n for n in a + b if n not in a or n not in b] 
1

Voici quelques possibilités différentes avec les ensembles

 
>>> a = [1, 2, 3, 4, 5, 1, 2] 
>>> b = [1, 2, 5, 6] 
>>> print list(set(a)^set(b)) 
[3, 4, 6] 
>>> print list(set(a)-set(b)) 
[3, 4] 
>>> print list(set(b)-set(a)) 
[6] 
>>> print list(set(a)-set(b))+list(set(b)-set(a)) 
[3, 4, 6] 
>>> 
Questions connexes