如何将大小为3的元组的列表制成键值对?

时间:2018-09-15 08:33:51

标签: python list dictionary tuples

目标:
第一个数字:第二个数字的键
第二个数字:值是第一个数字,但键是第三个数字
第三个数字:第二个数字的值

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]}

输出不是我想要的。如上所述,我希望第一个数字是第二个数字的键,而第二个数字是第三个数字的键。我将如何去做?

谢谢!

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]