2012-12-19 18 views
5

Chcę rozpakować utworzone przeze mnie krotki, wykonując następujące czynności, aby wynik był tylko jedną prostą listą. Mogę uzyskać pożądany wynik w 2-3 liniach, ale na pewno jest lista oneliner list.comp?Zrozumienie listy Pythona, rozpakowywanie i wiele operacji

x = range(10) 
y = [(i,j**2) for i,j in zip(x,x)] 
>>>y 
[(0, 0), (1, 1), (2, 4), (3, 9), (4, 16), (5, 25), (6, 36), (7, 49), (8, 64), (9 
, 81)] 
>>> 

Co chcę jest result = [0,0,1,1,2,4,3,9.....]

Doing

y = len(x)*[0] 
y[::2] = x 
y[1::2] = [i**2 for i in x] 

daje to, co chcę, ale co jeśli trzeba bardziej ogólnym przypadku:

y = [(i, sqrt(i), i**3, some_operation_on_i, f(i), g(i)) for i in x] 

Np powinienem być w stanie aby uzyskać prostą listę, taką jak wynik, w której podaję tylko jedną operację (kwadrat), aby śledzić każdy i, ale teraz z dowolną liczbą operacji następujących po i.

Odpowiedz

12
>>> import itertools 
>>> list(itertools.chain(*y)) 
[0, 0, 1, 1, 2, 4, 3, 9, 4, 16, 5, 25, 6, 36, 7, 49, 8, 64, 9, 81] 
11

Użyj zagnieżdżonego listowych:

result = [a for tup in y for a in tup] 

Przykład:

>>> x = range(10) 
>>> y = [(i,j**2) for i,j in zip(x,x)] 
>>> [a for tup in y for a in tup] 
[0, 0, 1, 1, 2, 4, 3, 9, 4, 16, 5, 25, 6, 36, 7, 49, 8, 64, 9, 81] 

To będzie działać dobrze dla bardziej ogólnym przypadku, jak również, czy można zrobić to wszystko w jednym kroku :

y = [a for i in x for a in (i, sqrt(i), i**3, some_operation_on_i, f(i), g(i))] 

W przypadku, gdy ne sted listowych wyglądać dziwnie, oto jak to wygląda jak normalny for pętli:

y = [] 
for i in x: 
    for a in (i, sqrt(i), i**3, some_operation_on_i, f(i), g(i)): 
     y.append(a) 
+0

Zapomniałeś zagnieżdżona lista comps całkowicie, dzięki. Zaakceptowanie tego, ponieważ jest to szybsza metoda i robi to w pliku list.comp. Zgadzam się, że to niezręczne, ale nie sądzę, że będę potrzebował więcej niż 4-5 operacji na i. – arynaq