如何使用重复键将元组列表转换为字典?

时间:2019-07-25 08:38:39

标签: python dictionary

如何转换元组列表,如:

query_res = [('a3','b6','c1'),
             ('a3','b6','c2'),
             ('a3','b6','c3'),
             ('a3','b7','c4'),
             ('a4','b8','c5'),
             ('a4','b8','c6')]

像这样的字典:

result = {
    'a3': {
        'b6': ['c1', 'c2', 'c3'],
        'b7': ['c4']
    },
    'a4': {
        'b8': ['c5', 'c6']
    }
}

我尝试了defaultdict,错误只能获取内部dict,如何在此处将a映射到res

res = defaultdict(list)
for a, b, c in query_res:
    res[b].append(c)

3 个答案:

答案 0 :(得分:6)

使用dict.setdefault

例如:

query_res = [('a3','b6','c1'),
             ('a3','b6','c2'),
             ('a3','b6','c3'),
             ('a3','b7','c4'),
             ('a4','b8','c5'),
             ('a4','b8','c6')]

result = {}
for key, subkey, value in query_res:
    result.setdefault(key, {}).setdefault(subkey, []).append(value)

print(result)

输出:

{'a3': 
    {'b6': ['c1', 'c2', 'c3'], 
     'b7': ['c4']
     },
 'a4': 
    {'b8': ['c5', 'c6']
     }
}

答案 1 :(得分:3)

您可以嵌套defaultdict

from collections import defaultdict
import pprint

d = defaultdict(lambda: defaultdict(list))

for a, b, c in query_res:
    d[a][b].append(c)

pprint.pprint(d)

输出:

defaultdict(<function <lambda> at 0x10acb1f28>,
            {'a3': defaultdict(<class 'list'>,
                               {'b6': ['c1', 'c2', 'c3'],
                                'b7': ['c4']}),
             'a4': defaultdict(<class 'list'>, {'b8': ['c5', 'c6']})})

答案 2 :(得分:0)

使用简单的for loopif条件。

例如。

query_res = [('a3','b6','c1'),
             ('a3','b6','c2'),
             ('a3','b6','c3'),
             ('a3','b7','c4'),
             ('a4','b8','c5'),
             ('a4','b8','c6')]

my_dict = {}

for a,b,c in query_res:
    #append nested dictionary key value
    if a in my_dict and b in my_dict[a]:
        my_dict[a][b].append(c)
   #check nested dictionary key does not exist then add key, value
    elif a in my_dict and b not in my_dict[a]:
        my_dict[a][b] = [c]
    else:
        my_dict[a] = {}
        my_dict[a][b] = [c]

print(my_dict)

O / P:

{'a3': {'b6': ['c1', 'c2', 'c3'], 'b7': ['c4']}, 'a4': {'b8': ['c5', 'c6']}}