2009-12-10 7 views
5

que je dois faire le contraire de cefaçon pythonique faire exploser une liste de tuples

Multiple Tuple to Two-Pair Tuple in Python?

A savoir, j'ai une liste de tuples

[(1,2), (3,4), (5,6)] 

et la nécessité de produire ce

[1,2,3,4,5,6] 

Personnellement, je le ferais

>>> tot = [] 
>>> for i in [(1,2), (3,4), (5,6)]: 
...  tot.extend(list(i)) 

mais j'aimerais voir quelque chose de plus fantaisiste.

+0

ouch tot.append (i) - qui s'étendent par un élément de la liste, me fait mal aux yeux :-) – Kugel

+0

vous êtes en train de prolonger avec une liste obtenue à partir du tuple. Je suis itérer sur une liste de tuples. –

+0

euh ... attendez une seconde. –

Répondre

18

La façon la plus efficace de le faire est la suivante:

tuples = [(1,2), (3,4), (5,6)] 
[item for t in tuples for item in t] 

sortie

[1, 2, 3, 4, 5, 6] 

Voici the comparison Je l'ai fait pour différentes façons de le faire dans une double question.

Je sais que quelqu'un va proposer cette solution

sum(tuples,()) 

Mais ne l'utilisez pas, il va créer une nouvelle liste de résultat intermédiaire pour chaque étape! à moins que vous ne vous souciez pas de la performance et que vous voulez juste une solution compacte. Pour plus de détails, consultez Alex's answer

En résumé: sum est plus rapide pour les petites listes, mais les performances se dégradent considérablement avec des listes plus grandes.

+1

définitivement très élégant. –

2
l = [(1,2), (3,4), (5,6)] 
reduce (lambda x,y: x+list(y), l, []) 
+0

Si vous allez ainsi, 'sum()' est plus simple (mais cette approche crée beaucoup de listes intermédiaires). – tonfa

6
>>> import itertools 
>>> tp = [(1,2),(3,4),(5,6)] 
>>> lst = list(itertools.chain(*tp)) 
>>> lst 
[1, 2, 3, 4, 5, 6] 

Bien sûr, si vous n'avez pas besoin d'une liste, mais un itérateur, vous pouvez déposer l'appel de conversion list().

+0

vous montrez comment chaîner trois tuples, pas une seule liste contenant trois tuples – SilentGhost

+1

Ou: lst = list (chain.from_iterable (tp)) –

+0

Je l'ai déjà édité, mais ce n'était pas seulement trois tuples mais un "tuple" de trois tuples "- maintenant changé en une liste de tuples ... –

Questions connexes