2014-02-20 52 views
0

我想知道一個優雅的Pythonic方式遍歷列表(或列表字典)列表在Python 3中並行。列表的數量直到運行時,所以我相信我不能簡單地將它們作爲參數提供給zip()函數。pythonic迭代多個列表並行

例如,給定以下數據結構:

var = [['x1' ,'x2' ,'x3'], ['y1', 'y2', 'y3'], ['z1', 'z2', 'z3'], …]

我想能夠訪問在每次迭代以下值:

x1,y1,z1隨後x2,y2,z2接着x3,y3,z3等上。

大概我可以直接使用列表索引或使用itertools.chain來實現此目的,但我正在尋找一種更優雅的方法,使用生成器或其他方法。

+1

相關:矩陣轉置Python](http://stackoverflow.com/q/4937491/4279) – jfs

回答

6

zip(*var)會自動解開您的列表清單。

因此,舉例來說:

var = [['x1' ,'x2' ,'x3'], ['y1', 'y2', 'y3'], ['z1', 'z2', 'z3'], ['w1', 'w2', 'w3']] 

for ltrs in zip(*var): 
    print(", ".join(ltrs)) 

結果

x1, y1, z1, w1 
x2, y2, z2, w2 
x3, y3, z3, w3 

編輯:每下面的評論,他要用的物品從字典,

var = { 
    'id_172': ['x1', 'x2', 'x3'], 
    'id_182': ['y1', 'y2', 'y3'], 
    'id_197': ['z1', 'z2', 'z3'] 
} 

我假設我們正在按排序順序使用鍵值:

keys = sorted(var.keys()) 
for ltrs in zip(*(var[k] for k in keys)): 
    print(", ".join(ltrs)) 

這給

x1, y1, z1 
x2, y2, z2 
x3, y3, z3 

警告:確實注意到這個排序在lexocographic順序(即串字母順序排列)鍵,因此,例如 「id_93」 後 「id_101」 來。如果您的標籤需要按數字順序進行排序,你會需要如果你看一下輸入和輸出數據小心,你實際上是調換二維陣列使用自定義按鍵功能,像

keys = sorted(var.keys(), key=lambda k: int(k[3:])) 
+0

奇妙,熱鬧而令人尷尬的優雅。非常感謝。 –

+0

我在問題中提到的一些事情是列表字典的情況。你知道我可以如何以這種方式並行訪問字典中的鍵和值(其中包含列表)嗎?據推測,我不能將'.items()'與'zip()'結合使用? –

+0

@bedeabc:你可以給一個示例字典輸入和輸出? –

2

。這可以很容易地用Python的內置zip函數來完成,像這樣

var = [['x1' ,'x2' ,'x3'], ['y1', 'y2', 'y3'], ['z1', 'z2', 'z3']] 
print list(zip(*var)) 
# [('x1', 'y1', 'z1'), ('x2', 'y2', 'z2'), ('x3', 'y3', 'z3')] 

可以遍歷它,像這樣

for x, y, z in zip(*var): 
    print x, y, z 

輸出

x1 y1 z1 
x2 y2 z2 
x3 y3 z3