从元组列表创建多层字典

0 投票
2 回答
76 浏览
提问于 2025-04-14 16:36

我有一个包含元组的列表,这些元组表示节点之间的关系:

key_value = [('A', 'B'), ('B', 'C'), ('C', 'E'), ('C', 'D'), ('E', 'F')]

从这个元组列表中,我想创建一个字典树。也就是说:

  1. 每个元组的第一个元素是父节点,第二个元素是子节点,最终的结构应该像这样:{"A": {"B": {} ...

  2. 如果子节点在其他元组中没有作为父节点出现,比如'D',那么它的值应该是一个空字典{}。

所以最终的输出应该是:

dict_tree = {'A': {'B': {'C': {'D': {}, 'E': {'F': {}}}}}}

我尝试了下面的代码,但离解决方案还很远:

from collections import defaultdict
dict_tree = defaultdict(dict)
key_value = [('A', 'B'), ('B', 'C'), ('C', 'E'), ('C', 'D'), ('E', 'F')]

for level, value in key_value:
    dict_tree[level][value] = {}

print(dict_tree)

输出:

defaultdict(<class 'dict'>, {'A': {'B': {}}, 'B': {'C': {}}, 'C': {'E': {}, 'D': {}}, 'E': {'F': {}}})

我该如何进一步处理这个问题呢?

2 个回答

2

我觉得你在找的东西可能是这样的:

key_value = [('A', 'B'), ('B', 'C'), ('C', 'E'), ('C', 'D'), ('E', 'F')]

def create_dict_tree(parent, key_value):
    child_dict = {}
    for k, v in key_value:
        if k == parent:
            child_dict[v] = create_dict_tree(v, key_value)
    return child_dict if child_dict else {}

parent = 'A'
dict_tree = {parent: create_dict_tree(parent, key_value)}
print(dict_tree)
3

我会选择这个:

key_value = [
    ("A", "B"),
    ("B", "C"),
    ("C", "E"),
    ("C", "D"),
    ("E", "F"),
]

dict_tree = {}
dicts_by_name = {}
for key, value in key_value:
    target = dicts_by_name.setdefault(key, {})
    if not dict_tree:  # no root yet, so install it
        dict_tree[key] = dicts_by_name[key]
    target[value] = dicts_by_name.setdefault(value, {})

print(dict_tree)

输出结果是

{'A': {'B': {'C': {'E': {'F': {}}, 'D': {}}}}}

这和你的输出是一样的(即使打印的顺序不同)。

撰写回答