2009-12-10 14 views
5

muszę zrobić przeciwieństwo tegopythonic sposobem eksplodować listę krotek

Multiple Tuple to Two-Pair Tuple in Python?

Mianowicie mam listę krotek

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

i trzeba produkować ten

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

Ja osobiście to zrobię

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

ale chciałbym zobaczyć coś ciekawszego.

+0

ouch tot.append (i) - które rozszerzają o jeden element listy, rani moje oczy :-) – Kugel

+0

rozszerzasz listę otrzymaną z krotki. I iterating nad listą krotek. –

+0

uh ... chwileczkę. –

Odpowiedz

18

Najbardziej skutecznym sposobem, aby to zrobić jest to:

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

wyjście

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

Oto the comparison zrobiłem dla różnych sposób, aby to zrobić w duplikatu pytanie.

wiem, ktoś ma zamiar zaproponować rozwiązanie to

sum(tuples,()) 

Ale nie należy go używać, to utworzyć nową listę pośredni wynik dla każdego kroku! chyba że nie dbasz o wydajność i po prostu chcesz mieć kompaktowe rozwiązanie. Aby uzyskać więcej informacji, sprawdź: Alex's answer

Podsumowując: suma jest szybsza w przypadku małych list, ale wydajność spada znacząco w przypadku większych list.

+1

zdecydowanie bardzo elegancki. –

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

Jeśli pójdziesz tą drogą, 'sum()' jest prostsze (ale to podejście tworzy wiele list pośrednich). – tonfa

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

Oczywiście, jeśli nie potrzebujemy liście, ale iterator, można upuścić połączenia list() konwersji.

+0

pokazano, jak połączyć trzy krotki, a nie jedną listę zawierającą trzy krotki. – SilentGhost

+1

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

+0

Już to edytowałem, ale to nie były tylko trzy krotki, ale "krotka" trzech krotek "- teraz zmieniono na listę krotek ... –