根据第一个值按组列出字典

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)

这是适合初学者的代码。

  1. 我们解压元组并将值放入各个变量
  2. 如果键已经在dic中,这意味着字典已经存在,我们只需添加另一对即可。
  3. 否则,我们在 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}}