gpt4 book ai didi

python - 展平一个字典的字典列表的其他字典的列表

转载 作者:行者123 更新时间:2023-11-28 21:49:02 25 4
gpt4 key购买 nike

我有这个高度嵌套的字典树:

sample = {"name": "one",
"id": "1",
"children": [{"name": "two",
"id": "2",
"children": [{"name": "six",
"id": "6",
"children": []},
{"name": "seven",
"id": "7",
"children": []}]},
{"name": "three",
"id": "3",
"children": []},
{"name": "four",
"id": "4",
"children": []},
{"name": "five",
"id": "5",
"children": []}]}

这只是一个例子,现实中有 7 或 8 级的子列表......而且每个名称和 ID 都是唯一的。

我的目标是将这棵树展平成一个字典,将所有名称键的值作为键,将它们的 ID 作为第二个键值对:

sample = {"one": {"id":"1"},
"two": {"id":"2"},
"three": {"id": "3"}, ...}

实际上还有更多键值对,但我只对名称及其关联的 id 感兴趣。

我一直在想办法,但是我在递归方面的技能不是很好,很难过,所以我向你求助。我也搜索过类似的问题,但事实上字典被封装在列表中使得它没有真正的可比性,无论如何对我来说......

我想出了一个解决方案来解决我的问题,但这是我写过的最骇人听闻、最丑陋的代码,我为此感到羞愧。基本上我将 dict 转换成它的字符串表示并使用正则表达式来找到我的对!这很糟糕,但我必须制作一些原型(prototype)才能有时间处理其他问题......

伙计们,有什么想法吗?

最佳答案

你可以像这样创建一个递归函数(假设每个字典的结构都正确):

def flatten(source, target):
target[source["name"]] = {"id": source["id"]}
for child in source["children"]:
flatten(child, target)

示例:

>>> d = {}
>>> flatten(sample, d)
>>> d
{'seven': {'id': '7'}, 'six': {'id': '6'}, 'three': {'id': '3'}, 'two': {'id': '2'}, 'four': {'id': '4'}, 'five': {'id': '5'}, 'one': {'id': '1'}}

或者像这样,如果你不喜欢将目标字典作为参数传递:

def flatten(source):
d = {source["name"]: {"id": source["id"]}}
for child in source["children"]:
d.update(flatten(child))
return d

示例:

>>> flatten(sample)
{'one': {'id': '1'}, 'four': {'id': '4'}, 'seven': {'id': '7'}, 'five': {'id': '5'}, 'six': {'id': '6'}, 'three': {'id': '3'}, 'two': {'id': '2'}}

您还可以将输出简化为一个简单的非嵌套字典:

def flatten(source):
d = {source["name"]: source["id"]}
for child in source["children"]:
d.update(flatten(child))
return d

>>> flatten(sample)
{'one': '1', 'four': '4', 'seven': '7', 'five': '5', 'six': '6', 'three': '3', 'two': '2'}

关于python - 展平一个字典的字典列表的其他字典的列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34190153/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com