2013-03-07 12 views

Odpowiedz

25
b = [i for sub in a for i in sub] 

To wystarczy.

+2

oh yeah, że było łatwo, co mam na myśli ... – LWZ

+0

ładny. Musiałem pomyśleć o tym przez sekundę - "skąd sub pochodzi z końca?" – bjd2385

+0

Dlaczego/jak to działa? – ruief

2
import itertools 
b = [i for i in itertools.chain(*[(1,3),(5,4)])] 
0

Wystarczy iteracyjne nad listy A i rozpakować krotki:

l = [] 
for x,y in a: 
    l.append(x) 
    l.append(y) 
7
In [11]: list(itertools.chain(*a)) 
Out[11]: [1, 3, 5, 4] 

Jeśli wystarczy iteracyjne nad 1, 3, 5, 4, można pozbyć się rozmowy list().

+0

Jaki jest sens "itertools.chain.from_iterable", jeśli możesz to zrobić? – Volatility

+1

@Volatility: Leniwa ocena? – NPE

+0

Hmm, na prawdę – Volatility

1

Innym sposobem:

a = [(1,3),(5,4)] 
b = [] 

for i in a: 
    for j in i: 
     b.append(j) 

print b 

To zajmie tylko krotki wewnątrz listy (a) tho. Musisz dodać instrukcje if-else, jeśli chcesz parsować w zmiennych luźnych, np.;

a = [(1,3),(5,4), 23, [21, 22], {'somevalue'}] 
b = [] 

for i in a: 
    if type(i) == (tuple) or type(i) == (list) or type(i) == (set): 
     for j in i: 
      b.append(j) 
    else: 
     b.append(i) 

print b 
+0

Użyj 'isinstance (i, collections.Iterable)' zamiast sprawdzania typu (zakładając, że 'kolekcje' zostało już zaimportowane) – Volatility

Powiązane problemy