将许多列表转换为单个字典

时间:2013-11-25 04:28:02

标签: python list dictionary

所以我有很多单独的名单:

[1,2,3]
[4,5,6]
[7,8,9]

现在我想把这三个单独的列表转换成这样的字典:

{1:4,7, 2:5,8, 3:6,9}

第一个列表中的每个元素都成为“键”,而下面的所有元素都成为“值”(或者它是否相反?)...

现在我明白这样的事情可以通过所谓的石斑鱼配方(itertools等)实现......如果是这样的话,列表是这样的:

([1,2,3],[4,5,6],[7,8,9])

但它不是那样......我不能试图用单独的列表来做这件事。

4 个答案:

答案 0 :(得分:4)

您可以像这样使用zipdictionary comprehension

l1, l2, l3 = [1,2,3], [4,5,6], [7,8,9]
data = [l1, l2, l3]
print {k:[v1, v2] for k, v1, v2 in zip(*data)}

<强>输出

{1: [4, 7], 2: [5, 8], 3: [6, 9]}

修改:如果列表是在循环中准备的,data可以像这样列表理解一起组成

data = [[j for j in range(i * 3, i * 3 + 3)] for i in range(3)]

答案 1 :(得分:4)

Python3具有新的和改进的解包语法:

>>> L1
[1, 2, 3]
>>> L2
[4, 5, 6]
>>> L3
[7, 8, 9]
>>> data = [L1,L2,L3]
>>> {k:v for k, *v in zip(*data)}
{1: [4, 7], 2: [5, 8], 3: [6, 9]}

然而,这在python2.x中不可用,所以你必须在前面使用@thefourtheye's answer

答案 2 :(得分:2)

@ thefourtheye答案的一般形式 - 即。适用于3个以上的列表

print {i[0]:i[1:] for i in zip(*data)}

和一个不使用dict理解的版本(解包类似于Python3版本)

print dict(map(lambda k, *v: (k, v), *data))

答案 3 :(得分:0)

import collections
def change(*L):
    res = collections.defaultdict(list)
    T = list(zip(*L[1:]))
for i, key in enumerate(L[0]):
    res[key] = T[i]
    return res

L1 = [1,  2,  3,  10]
L2 = [4,  5,  6,  11]
L3 = [7,  8,  9,  12]
L4 = [13, 14, 15, 16]
print(change(L1, L2, L3, L4))

输出为:{1: (4, 7, 13), 2: (5, 8, 14), 3: (6, 9, 15), 10: (11, 12, 16)})

请使用此代码,您可以处理任意数量的列表。