Ответ 1
Вы можете использовать конкатенацию кортежа в понимании списка:
>>> 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')]
У меня есть два списка, которые я хочу сделать zip:
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'), ... ]
Вы можете использовать конкатенацию кортежа в понимании списка:
>>> 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')]
Если вы используете python 3.5 или выше, вы можете использовать дополнительные распаковывающие обобщения (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')]
Вы можете использовать деструктурирование "вложенных" кортежей:
a = ((1, 2, 3), (4, 5, 6))
h = ('a', 'b')
out = [(x, y, z, c) for (x, y, z), c in zip(a, h)]
Простое решение, если длина элементов 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)]
Вы можете использовать цепочку из 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')]