python - 展平 Python Dict 并且仅在不唯一时更改键
问题描述
扁平化 Python 字典有很多很好的解决方案,但是当值是字典时,大多数递归方法似乎会自动将“父键”添加到键中(无论嵌套键是否是迄今为止唯一的) - 就像在这个解决方案。这是在嵌套时自动将父键添加到键的扁平化功能。
def flatten_dict(item, parent_key='', sep='_'):
final = []
for key, val in item.items():
new_key = parent_key + sep + key if parent_key else key
if isinstance(val, dict):
final.extend(flatten_dict(val, parent_key=new_key).items())
else:
final.append((new_key, val))
return dict(final)
我试图将一组“使用过的键”传递给 flatten_dict 并且仍然将父键添加到键中(我想它们在递归中被多次传递并被标记为已使用)。有没有办法使用递归仅在 key 不唯一的情况下将 parent_key 添加到 key 中?
例如:
flatten_dict({'a':1, 'b': {'a': 1, 'c': 1}})
返回:
{'a': 1, 'b_a':1, 'b_c': 1}
但理想情况下,我想:
{'a': 1, 'b_a': 1, 'c': 1} # because 'c' is unique
谢谢你的帮助!
解决方案
我建议使用“累加器”字典作为输入参数而不是列表。这可以有效地查找密钥是否已经存在。
def flat_dict(d, acc=None, parent_key=None, sep="_"):
out = dict() if acc is None else acc
for k, v in d.items():
if type(v) is dict:
flat_dict(v, out, parent_key=str(k))
else:
if k in out:
k = parent_key + sep + str(k)
out[k] = v
return out
如果你所有的键都已经是字符串,你当然可以放弃str
强制转换。
推荐阅读
- java - Java - 如何迭代 json 对象键和值对?
- r - 如何从 R 中的每日数据中的累积数字中获取实际值
- python - 在python中的两个单独字典中搜索键值对
- python - If 语句在 While True 循环中返回 False (Python)
- bitcoin - 原始交易错误:mandatory-script-verify-flag-failed(签名必须为零,失败的 CHECK(MULTI)SIG 操作)
- python - 从 php 文件启动的安全文件传输
- bootstrap-4 - Bootstrap-两列布局,一列两行,一列三布局,仅使用一个父容器
- laravel - Laravel 测试未通过
- python - 将具有多个excel文件和多个选项卡的文件夹中的所有电子邮件提取到python中的pandas数据框中
- java - KeyListener 方法 keyPressed 不起作用