2012-03-22 54 views
2

我的類型defaultdict(名單)Python字典的Python字典 這本詞典是這樣的:荏苒名單

a = {1:[1,2,3,4],2:[5,6,7,8]....n:[some 4 elements]} 

所以基本上它有它有一個列表作爲值和N鍵全部清單是相同的長度。 現在,我想建立一個類似這樣的列表。

[[1,5,...first element of all the list], [2,6.. second element of all the list]... and so on] 

Soo基本上我如何從所有的鍵獲得第k個值..是否有pythonic的方式來做到這一點? 感謝

+1

我描述你的問題,因爲分拆你的數組(或者在矩陣對話中,從行優先轉換到列優先排序)。我不做Python,所以其他人將不得不幫助你使用特定的代碼:) – Blindy 2012-03-22 18:14:12

回答

10
>>> a = {1:[1,2,3,4],2:[5,6,7,8], 3:[9, 10, 11, 12]} 
>>> 
>>> zip(*(a[k] for k in sorted(a))) 
[(1, 5, 9), (2, 6, 10), (3, 7, 11), (4, 8, 12)] 

(好吧,這會產生元組,而不是名單,但希望這不是一個問題。)

更新:我喜歡上面的比這更多,但下面是幾個按鍵短:

>>> zip(*map(a.get, sorted(a))) 
[(1, 5, 9), (2, 6, 10), (3, 7, 11), (4, 8, 12)] 
+0

+1。訂單顯然對於OP來說很重要。 – 2012-03-22 18:19:32

3

這個怎麼樣的解決方案: zip(*a.values())

對於例如

>>> a = {1:[1,2,3,4],2:[5,6,7,8], 3:[9, 10, 11, 12]} 
>>> zip(*a.values()) 
[(1, 5, 9), (2, 6, 10), (3, 7, 11), (4, 8, 12)] 

更新:中保持秩序使用DSM的answer

+0

很明顯,使用數字增加鍵的要點是提供一個排序順序來應用於這些值;正如所給出的,這個解決方案並沒有那樣做。 – 2012-03-22 18:17:08

+0

查看其他答案。您需要對鍵進行排序。 – 2012-03-22 18:17:49

1

列表理解使這很容易。爲了得到第k個項目的列表:

k = 1 
[a[key][k] for key in sorted(a.keys())] 

的建立名單列表:

[ [a[key][k] for key in sorted(a.keys())] for k in range(len(a[1]))] 
1

如果你想列出的名單(假設每個列表的長度爲= 4):

>>> a = {1:[1, 2, 3, 4], 2:[5, 6, 7, 8], 3:[9, 10, 11, 12]} 
>>> [[a[key][x] for key in sorted(a.keys())] for x in xrange(4)] 
[[1, 5, 9], [2, 6, 10], [3, 7, 11], [4, 8, 12]] 
2

的另一種方式做到這一點使用numpy的:

>>> import numpy 
>>> a = {1:[1,2,3,4],2:[5,6,7,8], 3:[9, 10, 11, 12]} 
>>> x = numpy.zeros((len(a),4), dtype=int) 
>>> x[[i-1 for i in a.keys()]] = a.values() 
>>> x.T 
array([[ 1, 5, 9], 
     [ 2, 6, 10], 
     [ 3, 7, 11], 
     [ 4, 8, 12]])