将数据添加到使用zip

时间:2016-08-24 13:51:06

标签: python python-3.x

我使用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并没有找到一个明显的候选人。

如果有人能指出我会受到高度赞赏的正确方向。

3 个答案:

答案 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但此时没有来源l1l2,则必须解压缩 {{ 1}},再次添加zipped列表并压缩:

l3

如果此时仍有>>> zip(*(zip(*zipped) + [l3])) [(1, 4, 7), (2, 5, 8), (3, 6, 9)] l1,请执行l2