gpt4 book ai didi

python - 展平嵌套的 Python 字典、压缩键并使用字典重复出现在子列表中

转载 作者:太空宇宙 更新时间:2023-11-03 10:52:28 25 4
gpt4 key购买 nike

我一直在使用 imranflatten nested Python dictionaries, compressing keys 的出色回答并且我正在尝试想办法进一步扁平化可能位于list字典items值中的字典。
(当然,因为我的数据通常来自 XML,这也可以是递归的...)

from pprint import pprint
from collections import MutableMapping

def flatten(d, parent_key='', sep='_'):
items = []
for k, v in d.items():
new_key = parent_key + sep + k if parent_key else k
if isinstance(v, MutableMapping):
items.extend(flatten(v, new_key, sep=sep).items())
else:
items.append((new_key, v))
return dict(items)

给定一个像这样的字典 d:

d = {"a": 1,
"b": 2,
"c": {"sub-a": "one",
"sub-b": "two",
"sub-c": "thre"}}

效果很好:

pprint(flatten(d))

{'a': 1,
'b': 2,
'c_sub-a': 'one',
'c_sub-b': 'two',
'c_sub-c': 'thre'}

但是,我想进一步遍历字典项的列表值,并检查列表中的每个字典是否可以进一步展平。

下面是一个使用 c-list 作为嵌套列表值的示例输入示例:

d = {"a": 1,
"b": 2,
"c-list": [
{"id": 1, "nested": {"sub-a": "one", "sub-b": "two", "sub-c": "thre"} },
{"id": 2, "nested": {"sub-a": "one", "sub-b": "two", "sub-c": "thre"} },
{"id": 3, "nested": {"sub-a": "one", "sub-b": "two", "sub-c": "thre"} }]}

这是我目前使用上述功能得到的结果:

pprint(flatten(d))

{'a': 1,
'b': 2,
'c-list': [{'id': 1, 'nested': {'sub-a': 'one', 'sub-b': 'two', 'sub-c': 'thre'}},
{'id': 2, 'nested': {'sub-a': 'one', 'sub-b': 'two', 'sub-c': 'thre'}},
{'id': 3, 'nested': {'sub-a': 'one', 'sub-b': 'two', 'sub-c': 'thre'}}]}

下面是我正在寻找的输出,保留了原始 flatten() 的所有功能:

{'a': 1,
'b': 2,
'c-list': [{'id': 1, 'nested_sub-a': 'one', 'nested_sub-b': 'two', 'nested_sub-c': 'thre'},
{'id': 2, 'nested_sub-a': 'one', 'nested_sub-b': 'two', 'nested_sub-c': 'thre'},
{'id': 3, 'nested_sub-a': 'one', 'nested_sub-b': 'two', 'nested_sub-c': 'thre'}]}

当它包含列表时,我正在努力弄清楚如何以递归方式将字典“重新组装”到这里……感谢任何提示。

最佳答案

你真的很接近,如果一个值是一个列表,那么只需要一行就可以让你得到 flatten 的递归版本:

items.append((new_key, map(flatten, v)))  # for python 2.x
# or
items.append((new_key, list(map(flatten, v)))) # for python 3.x

因此,您只需对每个元素递归调用该函数

下面是 flatten 的样子:

def flatten(d, parent_key='', sep='_'):
items = []
for k, v in d.items():
new_key = '{0}{1}{2}'.format(parent_key,sep,k) if parent_key else k
if isinstance(v, MutableMapping):
items.extend(flatten(v, new_key, sep=sep).items())
elif isinstance(v, list):
# apply itself to each element of the list - that's it!
items.append((new_key, map(flatten, v)))
else:
items.append((new_key, v))
return dict(items)

此解决方案可以处理列表中任意深度的列表

关于python - 展平嵌套的 Python 字典、压缩键并使用字典重复出现在子列表中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47602111/

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