2012-03-22 58 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]])