2017-02-05 5 views

Répondre

3

Vous pouvez utiliser set avec la compréhension de la liste:

lst = [(1,2),(1,3),(1,4),(1,5)] 

set(j for i in lst for j in i) 
# {1, 2, 3, 4, 5} 
+0

Ceci est le premier et le plus facile/pythonique pour résoudre la question. Très bonne réponse. –

+2

Vous pouvez également utiliser une définition d'ensemble: '{j pour i dans lst pour j dans i}'. :) – MSeifert

1

Utilisez chain.from_iterable à partir du module itertools. Il est généralement considéré comme le moyen idiomatique d'aplatir un itérable 2D par opposition à une compréhension de liste imbriquée. Voir this question.

>>> from itertools import chain 
>>> set(chain.from_iterable([(1,2),(1,3),(1,4),(1,5)])) 
{1, 2, 3, 4, 5} 

chain.from_iterable aplanit la liste et set maintient que des valeurs uniques.

Pour revenir à une liste, passez simplement au constructeur list.

>>>list(set(chain.from_iterable([(1,2),(1,3),(1,4),(1,5)]))) 
[1, 2, 3, 4, 5] 
0

Dans votre sortie attendue de l'ordre des éléments uniques suit l'ordre d'apparition. Une façon de le faire serait (en utilisant une bibliothèque externe, mais les recettes sont disponibles dans le itertools-recipes section):

>>> from iteration_utilities import flatten, unique_everseen 

>>> x = [(1,2),(1,3),(1,4),(1,5)] 

>>> list(unique_everseen(flatten(x))) 
[1, 2, 3, 4, 5]