压缩列表的python dict

时间:2012-03-22 18:11:31

标签: python

我有一个类型为defaultdict的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基本上如何从所有键中获取kth值..是否有pythonic方法来做到这一点.. ?? 感谢

5 个答案:

答案 0 :(得分: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)]

答案 1 :(得分: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

答案 2 :(得分: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]])

答案 3 :(得分: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]))]

答案 4 :(得分: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]]