从元组列表创建多层字典
我有一个包含元组的列表,这些元组表示节点之间的关系:
key_value = [('A', 'B'), ('B', 'C'), ('C', 'E'), ('C', 'D'), ('E', 'F')]
从这个元组列表中,我想创建一个字典树。也就是说:
每个元组的第一个元素是父节点,第二个元素是子节点,最终的结构应该像这样:{"A": {"B": {} ...
如果子节点在其他元组中没有作为父节点出现,比如'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': {}}}}}
这和你的输出是一样的(即使打印的顺序不同)。