如何堆叠来自脏dict的密钥并将其压平



我有一项任务要压平嵌套的dict,这很容易。这是我的代码:

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'
}

所以我不仅要压平嵌套dict,还要保存嵌套dict的键。我试着达到那个目标,但我失败了。

您可以对任务使用递归:

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",
}

为什么不使用input.keys((循环键,然后使用堆叠键

output['{}_{}'.format(key_level1, key_level2]]= input['key_level1']['key_level2'] 

您可能需要嵌套循环,并添加一个条件来测试dictionary中键的深度。

最新更新