我使用python内置函数zip()来组合两个列表:
l1 = [1,2,3]
l2 = [4,5,6]
zipped = zip(l1,l2)
是否可以“添加”此压缩对象,例如:
l3 = [7,8,9]
zipped2 = zipped.add(l3)
这样:
list(zipped2)
会屈服:
[(1,4,7),(2,5,8),(3,6,9)]
我试过例如:
zipped2 = zip(zipped,l3)
但结果是:
[((1, 4), 7), ((2, 5), 8), ((3, 6), 9)]
(这很有意义)
一个明显的方法是'压缩'压缩然后再拉包()再包括新列表,但是,这对我的应用程序来说是不实际的,我想根据一些逻辑添加可变数量的列表,所以我想知道是否已经有一些内置函数可以做到这一点。我检查了itertools并没有找到一个明显的候选人。
如果有人能指出我会受到高度赞赏的正确方向。
答案 0 :(得分:4)
一种方法是编写自己的生成器:
def add_to_zip(zipped, lst):
for tpl, elem in zip(zipped, lst):
yield tpl + (elem,)
zipped2 = add_to_zip(zipped, l3)
list(zipped2)
# OUT: [(1, 4, 7), (2, 5, 8), (3, 6, 9)]
如果要将其扩展到任意数量的列表:
def add_to_zip2(zipped, *lists):
for tpl, *elems in zip(zipped, *lists):
yield tpl + tuple(elems)
zipped3 = add_to_zip2(zipped, l3, l2)
list(zipped3)
# OUT: [(1, 4, 7, 4), (2, 5, 8, 5), (3, 6, 9, 6)]
答案 1 :(得分:3)
你无法向zip
函数添加任何内容,但你可以这样做(有很多选项):
l1 = [1,2,3]
l2 = [4,5,6]
l3 = [3,6,9]
l4 = [10,11,12]
l5 = [13,14,15]
args = [l1, l2]
print (zip(*args))
args.append(l3)
print (zip(*args))
# Using a class
class Zipped():
@staticmethod
def add(_list):
args.append(_list)
return zip(*args)
def zipped():
pass
zipped.add = Zipped.add
print (Zipped.add(l4))
print (zipped.add(l5))
# OR using a method
def add(_list):
args.append(_list)
return zip(*args)
def zipped():
pass
zipped.add = add
print (zipped.add(l4))
答案 2 :(得分:2)
如果您有zipped
但此时没有来源l1
和l2
,则必须解压缩 {{ 1}},再次添加zipped
列表并压缩:
l3
如果此时仍有>>> zip(*(zip(*zipped) + [l3]))
[(1, 4, 7), (2, 5, 8), (3, 6, 9)]
和l1
,请执行l2
。