如何转换元组列表,如:
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)
答案 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 loop
和if
条件。
例如。
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']}}