给定任意数量的压缩列表,例如
>>> L1 = [1,2,3]
>>> L2 = [1,2,3]
>>> zipped = zip(L1, L2)
[[(1, 1), (2, 2), (3, 3)]
如何将另一个列表附加到zipped,生成与
相同的输出>>> 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]]
背景:我想在循环中为任意数量的列表创建压缩列表。
编辑:
现在我觉得我错过了问题的一部分。这是一个基于RyE的回答的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 :(得分:10)
如果您真的喜欢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 :(得分: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
{{1}}可以包含任意数量的子列表。
答案 2 :(得分:1)
对于python3:
lst1 = [1,2,3]
lst2 = ['a','b','c']
lst3 = ['*','#','+']
lst4 = [4,5,6]
zipped = zip(lst1,lst2,lst3) #any number of lists
newlist = [(*z, j) for z, j in zip(zipped, lst4)]
#output
(1, 'a', '*', 4)
(2, 'b', '#', 5)
(3, 'c', '+', 6)
适用于任意数量的列表。
答案 3 :(得分:0)
您可以使用列表理解。
[(i[0], i[1], j) for i, j in zip(zipped, L3)]