我有一个类型为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方法来做到这一点.. ?? 感谢
答案 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]]