2017-02-08 3 views
1

Учитывая любое количество зашифрованных списков, например.Добавить в zip() в Python

>>> L1 = [1,2,3] 
>>> L2 = [1,2,3] 
>>> zipped = zip(L1, L2) 
[[(1, 1), (2, 2), (3, 3)] 

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

>>> L3 = [5,5,5] 
>>> zip(L1, L2, L3) 
[(1, 1, 5), (2, 2, 5), (3, 3, 5)] 

Я думал в направлении Append(), но это приводит к следующему нежелательному результату

>>> zipped.append(L3) 
[(1, 1), (2, 2), (3, 3), [5, 5, 5]] 

Фон: Я хочу создать zipped-list в цикле для любого количества списков.

EDIT:

Мне кажется теперь, что я пропускал одну часть моей проблемы. Вот MWE на основе ответа на Райана:

import random 

N = 4 
zipped2 = zip([1,2,3],[1,2,3]) # works 
zipped2 = [] # does not work 
for n in range(N): 
    Ln = random.sample(xrange(100),3) 
    zipped2 = [old + (new,) for old, new in zip(zipped2, Ln)] 

print(zipped2) 

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

+0

Извините, я пропустил ваше редактирование. Если вы просто хотите закрепить любое количество списков вместе, это 'zip (* lists)'. – Ryan

ответ

7

Если вы действительно любите слово zip, вы можете использовать его много:

zip(*zip(*zipped), L3) 

Если вы используете Python 2 или поклонник того, люди понимают код, список осмысленности вероятно, лучше всего:

[old + (new,) for old, new in zip(zipped, L3)] 

Ваша правка, кажется, указать, что вы просто хотите, чтобы пронестись некоторое количество списков, хотя:

import random 

N = 4 
columns = [] 
for n in xrange(N): 
    Ln = random.sample(xrange(100), 3) 
    columns.append(Ln) 

zipped2 = zip(*columns) 
print(zipped2) 
+1

Стоит +10 для * является поклонником понимания людьми вашего кода * – nigel222

0

Вы можете использовать список.

[(i[0], i[1], j) for i, j in zip(zipped, L3)] 
4

Вы можете создать списки, которые вы хотите, чтобы «добавить» до рук, а затем распаковать их с *:

lists = [[1, 2, 3], [1, 2, 3]] 

print(list(zip([1, 2, 3], [1, 2, 3], *lists))) 
# [(1, 1, 1, 1), (2, 2, 2, 2), (3, 3, 3, 3)] 

lists может содержать произвольное число подсписков.