2016-11-20 2 views
13

У меня есть два списка, который я хочу zip:Python: сплющивание почтового индекса?

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

Простой zip(a,h) возвращает это:

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

Есть ли умный способ вернуть это?

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

Определенно не самый лучший способ, но, вероятно, самый короткий: 'почтовый (* (zip (* a) + [h])) ' –

ответ

16

Вы можете использовать кортеж конкатенацию в списке понимание:

>>> 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. Конечно. Спасибо. – oneloop

8

Если вы используете питона 3.5 или выше, вы можете использовать additional unpacking generalizations (PEP 448):

In [24]: [(*one,two) for one, two in zip(((1, 2, 3), (4, 5, 6)) ,('a','b'))] 
    Out[24]: [(1, 2, 3, 'a'), (4, 5, 6, 'b')] 
+0

Да, это то, что я пробовал. Но 'SyntaxError' – oneloop

+0

Работает только с Python 3.4+ – Daniel

+0

ах да, мой ipython по умолчанию равен 3.x – salparadise

5

Вы можете использовать «Вложенные» деструкции кортежа:

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

Умный. Спасибо. – oneloop

+1

Но это предполагает, что 'a' будет содержать кортежи всего из 3 элементов. –

+0

@MoinuddinQuadri Я считаю, что это справедливое предположение, чтобы сделать данный вопрос OPs. Если вы имеете дело со списком кортежей разной длины или с кортежами с более чем пятью или около того элементами, ответ eugene y - это путь. – pzp

1

Простое решение, если длина a пункты фиксируется до 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

Вы можете использовать цепочку из 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

Это зависит от элементов 'h', являющихся итерабельными. Попробуйте 'h = ('a', 'b', 3)' например. –

Смежные вопросы