目标:
第一个数字:第二个数字的键
第二个数字:值是第一个数字,但键是第三个数字
第三个数字:第二个数字的值
def make_dictionary_list(old_list):
return {key: values for key, *values in old_list}
输入:
[(4157, 1, 1), (4157, 1, 10), (4157, 2, 1), (4157, 2, 10), (4157, 3, 1), (4157, 3, 10), (4157, 4, 1), (4157, 4, 10), (4182, 1, 1)]
输出:
{4157: [4, 10], 4182: [1, 1]}
输出不是我想要的。如上所述,我希望第一个数字是第二个数字的键,而第二个数字是第三个数字的键。我将如何去做?
谢谢!
答案 0 :(得分:2)
您解开列表,然后使用dict.setdefault()将其放入字典中:
data = [(4157, 1, 1), (4157, 1, 10), (4157, 2, 1), (4157, 2, 10), (4157, 3, 1),
(4157, 3, 10), (4157, 4, 1), (4157, 4, 10), (4182, 1, 1)]
d = {}
for k,v,p in data:
key = d.setdefault(k,{})
key[v]=p
print(d)
输出:
{4157: {1: 10, 2: 10, 3: 10, 4: 10}, 4182: {1: 1}}
您可以通过以下方式访问它:
print( d[4157][3] ) # 10
结果要比源数据短,因为您将第一个值替换为第二个值:
(4157, 1, 1) => (4157, 1, 10) # 10 replaces 1
(4157, 2, 1) => (4157, 2, 10) # etc.
(4157, 3, 1) => (4157, 3, 10)
(4157, 4, 1) => (4157, 4, 10)
您可以像这样汇总它们:
for k,v,p in data:
key = d.setdefault(k,{})
key2 = key.setdefault(v,[])
key2.append(p)
print(d)
要获得以下输出:
{4157: {1: [1, 10], 2: [1, 10], 3: [1, 10], 4: [1, 10]}, 4182: {1: [1]}}
并通过
访问print( d[4157][3] ) # [1, 10]