将2d列表和1d列表映射到字典

时间:2015-03-23 10:32:41

标签: python python-2.7

我有一个清单 -

index = ['a','b','c','d']

二维清单 - val = [[1,11,21,31],[3,13,23,33],[7,17,27,37]]

如何在字典中映射这些数组,以使值如下 -

d = {'a': [1,3,7] ,'b': [11,13,17] ,'c': [21,23,27] ,'d': [31,33,37] }

最有效的方法是什么?

我想通过循环2d列表来做这件事效率不高? 有没有办法通过使用dict(zip()函数来实现,即我们在映射两个1d列表时的方式呢?

我使用dict(zip(index,val))尝试了它。但它给了我

d = {'a' : [1,11,21,31], 'b' : [3,13,23,33], 'c' : [7,17,27,37]

感谢。

3 个答案:

答案 0 :(得分:4)

val的形状为(3,4),但为了使用dict形成zip,第一个维度必须与索引数相匹配:在这种情况下,4你可以通过转置val来实现这一点。

转置列表清单:

>>> zip(*val)
[(1, 3, 7), (11, 13, 17), (21, 23, 27), (31, 33, 37)]

然后,您可以将结果与索引一起压缩以形成dict

>>> dict(zip(index, zip(*val)))
{'d': (31, 33, 37), 'a': (1, 3, 7), 'b': (11, 13, 17), 'c': (21, 23, 27)}

答案 1 :(得分:3)

index = ['a','b','c','d']
val = [[1,11,21,31],[3,13,23,33],[7,17,27,37]]

print dict(zip(index, zip(*val)))

输出:

{'a': (1, 3, 7), 'c': (21, 23, 27), 'b': (11, 13, 17), 'd': (31, 33, 37)}

如果你需要列表而不是元组。

print dict(zip(index, [list(i) for i in zip(*val)]))

输出:

{'a': [1, 3, 7], 'c': [21, 23, 27], 'b': [11, 13, 17], 'd': [31, 33, 37]}

答案 2 :(得分:1)

尝试:

index = ['a','b','c','d']
val = [[1,11,21,31],[3,13,23,33],[7,17,27,37]]

>>> print map(list,zip(*val))
[[1, 3, 7], [11, 13, 17], [21, 23, 27], [31, 33, 37]]

>>> print dict(zip(index,map(list,zip(*val))))
{'a': [1, 3, 7], 'c': [21, 23, 27], 'b': [11, 13, 17], 'd': [31, 33, 37]}