2012-02-07 85 views
0

我有一個列表字典,列表代表列。所有列表長度相同,列表數量可變。我想將列的列表轉換爲行列表。它不必在字典中結束矩陣是完美的;但是,我不能使用numpy列到列表的列表

例如:設置看起來像這樣

>>> A = [ 1 , 2 , 3 , 4 , 5 , 6] 
>>> B = ["A", "B", "C", "D", "E", "F"] 
>>> C = ["J", "K", "L", "M", "N", "O"] 
>>> d = {"One": A, "Two": B, "Three": C} 

這裏做魔術和得到以下

[(1, 'A', 'J'), (2, 'B', 'K'), (3, 'C', 'L'), (4, 'D', 'M'), (5, 'E', 'N'), (6, 'F', 'O')] 

公告中的cols的第一個元素現在在一排。現在我可以通過這樣做

>>> zip(d["One"], d["Two"], d["Three"]) 

但這隻會工作,如果字典條目的數量是恆定的。如果字典條目的數量可變,我該如何做到這一點?希望我清楚。

+0

字典中的鍵的順序是否重要?我的意思是,鑰匙真的是「一個」,「兩個」,「三個」,你想按照通常的順序使用它們嗎? – 2012-02-07 17:37:09

+0

@Sven Marnach沒有順序無關緊要。 – Jeff 2012-02-07 17:38:33

+0

[Python中的移調/解壓縮函數]的可能重複(http://stackoverflow.com/questions/19339/a-transpose-unzip-function-in-python) – 2012-02-07 17:39:27

回答

2

查看Unpacking Argument Lists的文檔。通過將*放置在作爲函數參數的迭代器前面,函數將使用該迭代器中的元素作爲其參數進行調用。例如zip(*['ab', 'cd', 'ef'])將變爲zip('ab', 'cd', 'ef')

使用這種方法,你可以生成你的壓縮任意大小的字典的名單,但要注意,因爲字典是無序的,你需要提供一個單獨的列表作爲結果列羣組的次序來使用,例如:

>>> A = [ 1 , 2 , 3 , 4 , 5 , 6] 
>>> B = ["A", "B", "C", "D", "E", "F"] 
>>> C = ["J", "K", "L", "M", "N", "O"] 
>>> d = {"One": A, "Two": B, "Three": C} 
>>> order = ["One", "Two", "Three"] 
>>> zip(*[d[k] for k in order]) 
[(1, 'A', 'J'), (2, 'B', 'K'), (3, 'C', 'L'), (4, 'D', 'M'), (5, 'E', 'N'), (6, 'F', 'O')] 

如果列順序無關緊要,您可以使用Sven's solution這非常簡潔,但元組順序將是任意的。

4

如果字典項的順序並不重要,你可以做

zip(*d.values()) 

,以獲得期望的結果。