所以我有很多单独的名单:
[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])
但它不是那样......我不能试图用单独的列表来做这件事。
答案 0 :(得分:4)
您可以像这样使用zip和dictionary 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)})
请使用此代码,您可以处理任意数量的列表。