2016-08-24 33 views
0

我使用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)] 

(這是有道理的)

一個顯而易見的方法是 '解壓' 壓縮,然後zip()再次包括新的列表,但是,這是不實際的我的應用程序是我想添加一個可變數量的列表取決於一些邏輯,所以我想知道如果th已經有一些內置的功能可以做到這一點。我檢查了itertools,沒有找到明顯的候選人。

如果有人能指出我會正確的方向,將不勝感激。

+0

任何不首先做「zip(l1,l2,l3)」的原因? – DeepSpace

+0

是l1和l2是在算法中的不同位置創建的,我正在尋找一種通用解決方案,您可以在其中動態添加n個列表 – BartDur

+0

如果符合您的條件,請批准此答案:http:// stackoverflow.com/questions/39125200/adding-data-to-an-iterator-created-with-zip/39125301#39125301 – turkus

回答

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)] 
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

如果您有zipped,但沒有在這一點上源l1l2,你將不得不解壓zipped,添加l3列表,再次郵編:

>>> zip(*(zip(*zipped) + [l3])) 
[(1, 4, 7), (2, 5, 8), (3, 6, 9)] 

如果您仍然有l1l2在這點,只需做zip(l1, l2, l3)