2016-11-20 15 views
13

Mam dwie listy, który chcę Kod pocztowy:Python: spłaszczanie suwaka?

a = ((1,2,3), (4,5,6), ...) 
h = ('a','b', ...) 

Prosty zip(a,h) zwraca ten:

[ ((1,2,3),'a'), ((4,5,6),'b'), ... ] 

Czy jest jakiś sprytny sposób, aby powrócić to?

[ (1,2,3,'a'), (4,5,6,'b'), ... ] 
+1

Na pewno nie jest to najlepszy sposób, ale chyba najkrótsza: 'zip (* (zip (* a) + [h])) ' –

Odpowiedz

16

Można użyć krotka konkatenacji w listowego:

>>> a = ((1, 2, 3), (4, 5, 6)) 
>>> h = ('a', 'b') 
>>> [x + (y,) for x, y in zip(a, h)] 
[(1, 2, 3, 'a'), (4, 5, 6, 'b')] 
+0

Uch. Oczywiście. Dziękuję Ci. – oneloop

5

Można by użyć "zagnieżdżone" krotka rozpad:

a = ((1, 2, 3), (4, 5, 6)) 
h = ('a', 'b') 
out = [(x, y, z, c) for (x, y, z), c in zip(a, h)] 
+0

Sprytny. Dziękuję Ci. – oneloop

+1

Ale to zakłada 'A' odbędzie krotki tylko 3 elementy –

+0

@MoinuddinQuadri wierzę, że to uczciwe założenie, aby biorąc pod uwagę kwestię OPS. Jeśli masz do czynienia z listą krotek o różnych długościach lub z krotek zawierających więcej niż pięć lub więcej elementów, Eugene Y za odpowiedź jest droga. – pzp

1

Proste rozwiązanie, jeśli długość a Pracuj jest ustalona na 3:

a = ((1, 2, 3), (4, 5, 6)) 
h = ('a', 'b') 

[(x[0], x[1], x[2], y) for x, y in zip(a, h)] 
0

Można użyć łańcuch z itertools:

>>> from itertools import chain 
>>> a = ((1,2,3), (4,5,6), (7,8,9)) 
>>> h = ('a','b', 'c') 
>>> [ tuple(chain(x,y)) for x,y in zip(a,h) ] 
[(1, 2, 3, 'a'), (4, 5, 6, 'b'), (7, 8, 9, 'c')] 
+0

Powoduje to, że elementy 'h' są iterowalne. Spróbuj na przykład 'h = ('a', 'b', 3)'. –

Powiązane problemy