web-dev-qa-db-fra.com

Pythonic Way pour créer une union de toutes les valeurs contenues dans plusieurs listes

J'ai une liste de listes:

lists = [[1,4,3,2,4], [4,5]]

Je veux aplatir cette liste et supprimer tous les doublons; ou, en d'autres termes, appliquer une opération d'union définie:

desired_result = [1, 2, 3, 4, 5]

Quelle est la façon la plus simple de procéder? (Je suis obligé d'utiliser Python 2.4 pour ce projet)

61
AJ.

set.union fait ce que vous voulez:

>>> results_list = [[1,2,3], [1,2,4]]
>>> results_union = set().union(*results_list)
>>> print(results_union)
set([1, 2, 3, 4])

Vous pouvez également le faire avec plus de deux listes.

119
sth

Puisque vous semblez utiliser Python 2.5 (il serait agréable à mentionner dans votre Q si vous avez besoin d'un A pour les versions! = 2.6, la production actuelle, soit dit en passant ;-) et je veux une liste plutôt qu'un ensemble comme résultat, je recommande:

   import itertools

   ...

   return list(set(itertools.chain(*result_list)))

itertools est généralement un excellent moyen de travailler avec des itérateurs (et donc avec de nombreux types de séquences ou de collections) et je vous recommande vivement de vous familiariser avec lui. itertools.chain, en particulier, est documenté ici .

11
Alex Martelli

Les syndicats ne sont pas pris en charge par les listes, qui sont ordonnées, mais sont prises en charge par les ensembles. Découvrez set.union .

2
Justin R.

J'ai utilisé ce qui suit pour faire des intersections, ce qui évite d'avoir besoin d'ensembles.

a, b= [[1,2,3], [1,2]]
s = filter( lambda x: x in b, a)

ou,

s = [ x for x in b if x in a ]
2
Bear

Vous pouvez également suivre ce style

In [12]: a = ['Orange and Banana', 'Orange Banana']
In [13]: b = ['Grapes', 'Orange Banana']
In [14]: c = ['Foobanana', 'Orange and Banana']

In [20]: list(set(a) | set(b) | set(c))
Out[20]: ['Orange and Banana', 'Foobanana', 'Orange Banana', 'Grapes']

In [21]: list(set(a) & set(b) | set(c))
Out[21]: ['Orange and Banana', 'Foobanana', 'Orange Banana']    
1
GrvTyagi