python - 如何从嵌套字典中堆叠键并将其展平
问题描述
我有一个任务是扁平化嵌套的字典,这很容易。这是我的代码:
class Simple:
def __init__(self):
self.store_data = {}
def extract_data(self, config):
for key in config:
if isinstance(config[key], dict):
self.extract_data(config[key])
else:
self.store_data[{key}] = config[key]
return self.store_data
这是我的输入:
input = {
'k1_lv1': {
'k1_lv2': 'v1_lv2', 'k2_lv2': 'v2_lv2'},
'k2_lv1': 'v1_lv1',
'k3_lv1': {
'k1_lv2': 'v1_lv2', 'k2_lv2': 'v2_vl2'},
'k4_lv1': 'v1_lv1',
}
这是我的输出(假设键是唯一的):
output = {
'k1_lv2': 'v1_lv2', 'k2_lv2': 'v2_lv2',
'k2_lv1': 'v1_lv1',
'k1_lv2': 'v1_lv2', 'k2_lv2': 'v2_vl2',
'k4_lv1': 'v1_lv1'
}
但现在我的任务已经改变,我的输出必须变成这样:
output = {
'k1_lv1_k1_lv2': 'v1_lv2',
'k1_lv1_k2_lv2': 'v2_lv2',
'k2_lv1': 'v1_lv1',
'k3_lv1_k1_lv2': 'v1_lv2',
'k3_lv1_k2_lv2': 'v2_vl2',
'k4_lv1': 'v1_lv1'
}
所以我不仅要展平嵌套的字典,还要保存嵌套字典的键。我试图实现该输出,但我失败了。
解决方案
您可以对任务使用递归:
dct = {
"k1_lv1": {"k1_lv2": "v1_lv2", "k2_lv2": "v2_lv2"},
"k2_lv1": "v1_lv1",
"k3_lv1": {"k1_lv2": "v1_lv2", "k2_lv2": "v2_vl2"},
"k4_lv1": "v1_lv1",
}
def flatten(d, path=""):
if isinstance(d, dict):
for k, v in d.items():
yield from flatten(v, (path + "_" + k).strip("_"))
else:
yield (path, d)
out = dict(flatten(dct))
print(out)
印刷:
{
"k1_lv1_k1_lv2": "v1_lv2",
"k1_lv1_k2_lv2": "v2_lv2",
"k2_lv1": "v1_lv1",
"k3_lv1_k1_lv2": "v1_lv2",
"k3_lv1_k2_lv2": "v2_vl2",
"k4_lv1": "v1_lv1",
}
推荐阅读
- c# - 等于覆盖和 LINQ GroupBy
- excel - 如何在 Excel 中找到值与前一列不同的最后一列?
- angular - 在 Ionic 的警报控制器中更改输入的输入类型
- power-automate - Power Automate Flow:Repeatable Control 复制数据
- linux - 匿名内存是 Linux 上页面缓存的一部分吗?
- javascript - MathJax 未在 html 页面上呈现
- r - 对多个向量使用 mapply,但每个元素只使用一次
- amazon-dynamodb - 用于管理员面板/用户登录的 DynamoDB 表结构
- reactjs - NextJS:Axios 在从 django 登录后将 JWT 令牌设置为 HttpOnly cookie 的经过身份验证的页面返回 401 错误
- microsoft-graph-api - 在 PHP 中使用 Microsoft Graph 对组织用户进行身份验证时出现 403 错误