根据第一个值按组列出字典
list to dict with a group by on first value
是否有任何技巧可以轻松地将列表转换为具有这种特定格式的字典?我一直做不到。
发件人:
a = [
('A', 'B', 8),
('A', 'D', 10),
('A', 'E', 12),
('B', 'C', 6),
('B', 'F', 12),
('C', 'F', 8),
('D', 'E', 10),
('D', 'G', 30),
('E', 'F', 10),
('F', 'G', 12)
]
收件人:
b = {
"A": {"B": 8, "D": 10, "E": 12},
"B": {"C": 6, "F": 12},
"C": {"F": 8},
"D": {"E": 10, "G": 30},
"E": {"F": 10},
"F": {"G": 12}
}
提前感谢您的提示
使用 collections 模块中的 defaultdict
:
from collections import defaultdict
b = defaultdict(dict)
for k, k1, v in a:
b[k].update({k1: v})
输出:
>>> b
defaultdict(dict,
{'A': {'B': 8, 'D': 10, 'E': 12},
'B': {'C': 6, 'F': 12},
'C': {'F': 8},
'D': {'E': 10, 'G': 30},
'E': {'F': 10},
'F': {'G': 12}})
没有defaultdict
的替代版本:
b = {}
for k, k1, v in a:
t = b.setdefault(k, {})
t[k1] = v
循环列表,检查关键字是否在字典中。如果是,则将其添加到该键的字典中。如果不是,则创建密钥字典:
a = [
('A', 'B', 8),
('A', 'D', 10),
('A', 'E', 12),
('B', 'C', 6),
('B', 'F', 12),
('C', 'F', 8),
('D', 'E', 10),
('D', 'G', 30),
('E', 'F', 10),
('F', 'G', 12)
]
final_list = {}
for item in a:
if item[0] in final_list.keys():
final_list[item[0]][item[1]] = item[2]
else:
final_list[item[0]] = {item[1]: item[2]}
print(final_list)
这是适合初学者的代码。
- 我们解压元组并将值放入各个变量
- 如果键已经在
dic
中,这意味着字典已经存在,我们只需添加另一对即可。
- 否则,我们在
dic
中创建一个新的键值对,其中值是一个字典。
list = [
('A', 'B', 8),
('A', 'D', 10),
('A', 'E', 12),
('B', 'C', 6),
('B', 'F', 12),
('C', 'F', 8),
('D', 'E', 10),
('D', 'G', 30),
('E', 'F', 10),
('F', 'G', 12)
]
dic = {}
for tuple in list:
key, element, num = tuple
if key in dic:
dic[key][element] = num
else:
dic[key] = {element: num}
for k, v in dic.items():
print(f"{k}: {v}")
输出:
{
"A": {"B": 8, "D": 10, "E": 12},
"B": {"C": 6, "F": 12},
"C": {"F": 8},
"D": {"E": 10, "G": 30},
"E": {"F": 10},
"F": {"G": 12}
}
如果第一级键是按分组顺序排列的,您可以在字典理解中使用 itertools 中的 groupby:
from itertools import groupby
d = { k:{c:n for _,c,n in v} for k,v in groupby(a,key=lambda t:t[0]) }
print(d)
{'A': {'B': 8, 'D': 10, 'E': 12},
'B': {'C': 6, 'F': 12},
'C': {'F': 8},
'D': {'E': 10, 'G': 30},
'E': {'F': 10},
'F': {'G': 12}}
是否有任何技巧可以轻松地将列表转换为具有这种特定格式的字典?我一直做不到。
发件人:
a = [
('A', 'B', 8),
('A', 'D', 10),
('A', 'E', 12),
('B', 'C', 6),
('B', 'F', 12),
('C', 'F', 8),
('D', 'E', 10),
('D', 'G', 30),
('E', 'F', 10),
('F', 'G', 12)
]
收件人:
b = {
"A": {"B": 8, "D": 10, "E": 12},
"B": {"C": 6, "F": 12},
"C": {"F": 8},
"D": {"E": 10, "G": 30},
"E": {"F": 10},
"F": {"G": 12}
}
提前感谢您的提示
使用 collections 模块中的 defaultdict
:
from collections import defaultdict
b = defaultdict(dict)
for k, k1, v in a:
b[k].update({k1: v})
输出:
>>> b
defaultdict(dict,
{'A': {'B': 8, 'D': 10, 'E': 12},
'B': {'C': 6, 'F': 12},
'C': {'F': 8},
'D': {'E': 10, 'G': 30},
'E': {'F': 10},
'F': {'G': 12}})
没有defaultdict
的替代版本:
b = {}
for k, k1, v in a:
t = b.setdefault(k, {})
t[k1] = v
循环列表,检查关键字是否在字典中。如果是,则将其添加到该键的字典中。如果不是,则创建密钥字典:
a = [
('A', 'B', 8),
('A', 'D', 10),
('A', 'E', 12),
('B', 'C', 6),
('B', 'F', 12),
('C', 'F', 8),
('D', 'E', 10),
('D', 'G', 30),
('E', 'F', 10),
('F', 'G', 12)
]
final_list = {}
for item in a:
if item[0] in final_list.keys():
final_list[item[0]][item[1]] = item[2]
else:
final_list[item[0]] = {item[1]: item[2]}
print(final_list)
这是适合初学者的代码。
- 我们解压元组并将值放入各个变量
- 如果键已经在
dic
中,这意味着字典已经存在,我们只需添加另一对即可。 - 否则,我们在
dic
中创建一个新的键值对,其中值是一个字典。
list = [
('A', 'B', 8),
('A', 'D', 10),
('A', 'E', 12),
('B', 'C', 6),
('B', 'F', 12),
('C', 'F', 8),
('D', 'E', 10),
('D', 'G', 30),
('E', 'F', 10),
('F', 'G', 12)
]
dic = {}
for tuple in list:
key, element, num = tuple
if key in dic:
dic[key][element] = num
else:
dic[key] = {element: num}
for k, v in dic.items():
print(f"{k}: {v}")
输出:
{
"A": {"B": 8, "D": 10, "E": 12},
"B": {"C": 6, "F": 12},
"C": {"F": 8},
"D": {"E": 10, "G": 30},
"E": {"F": 10},
"F": {"G": 12}
}
如果第一级键是按分组顺序排列的,您可以在字典理解中使用 itertools 中的 groupby:
from itertools import groupby
d = { k:{c:n for _,c,n in v} for k,v in groupby(a,key=lambda t:t[0]) }
print(d)
{'A': {'B': 8, 'D': 10, 'E': 12},
'B': {'C': 6, 'F': 12},
'C': {'F': 8},
'D': {'E': 10, 'G': 30},
'E': {'F': 10},
'F': {'G': 12}}