2014-01-28 3 views
2

Предположим, у меня есть список двухэлементных кортежей и список (не кортежей) литералов, например. целое число:Как я могу добавить zip-список в уже заархивированный список?

a = [('x', 'a'), ('y', 'b'), ('z', 'c')] 
b = [1, 2 ,3] 

И я хочу, чтобы составить список из трех элементов кортежей, так что я закодирован, как показано ниже:

zipped = zip((t[0] for t in a), (t[1] for t in a), b) 
assert zipped == [('x', 'a', 1), ('y', 'b', 2), ('z', 'c', 3)] 

Мой текущий код работает довольно хорошо, но я хочу знать, что там больше эффективный и элегантный рецепт, однако мой код должен повторять и распаковывать каждый кортеж дважды. Может ли кто-нибудь посоветуете?

ответ

7

Использование списка понимание, кортеж распаковка:

>>> a = [('x', 'a'), ('y', 'b'), ('z', 'c')] 
>>> b = [1, 2 ,3] 
>>> [(x,y,z) for (x,y), z in zip(a, b)] 
[('x', 'a', 1), ('y', 'b', 2), ('z', 'c', 3)] 

>>> a = [('x', 'a'), ('y', 'b'), ('z', 'c')] 
>>> b = [1, 2 ,3] 
>>> [x + (y,) for x, y in zip(a, b)] 
[('x', 'a', 1), ('y', 'b', 2), ('z', 'c', 3)] 
3

один без использования для цикла,

zip(*(zip(*a)+ [b])) 
+0

Нет необходимости вызывать 'tuple':' застежка-молния (* (застежка-молния (* a) + [b])) 'также работают. BTW, это не будет работать в Python 3.x becaue ['zip' в Python 3.x] (http://docs.python.org/3/library/functions.html#zip) возвращает итератор вместо списка. – falsetru

+0

да, это правда. Ред. Благодарю. –

+0

Не использовать 3.x, но я полагаю, вы можете преобразовать итератор в список, используя list(). Вероятно, zip (* (список (zip (* a)) + [b]) должен работать там. –

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