dictionary - 我如何在python中创建一个嵌套字典的字符串(无循环)作为其相应树的一系列分支
问题描述
问题:
一个打印字典的函数,如下例所示
recursive_dict = {
'a': 1,
'b': {
'c': 1,
'd': 4
},
'e':
{
'f': 3,
'g':
{
'h': 5,
'i': 6
}
},
'j': 10
}
to
'a' - 1
'b' - 'c' - 1
'b' - 'd' - 4
'e' - 'f' - 3
'e' - 'g' - 'h' - 5
'e' - 'g' - 'i' - 6
'j' - 10
我的代码:
欢迎对代码提出任何批评,因为我是 python 初学者,或者任何使代码更易于阅读的方法。该代码在更高级别的递归值之后不起作用,因为它保留了旧密钥。我想我必须检测字典何时结束,所以我从 old_key 中删除我连接的最后一个键。另一个更难?想法是将字典转换为树,然后继续读取树的所有分支。
def print_dictionary_tree(tree_dict, default_separator='-', branch="", old_key=""):
for key, value in tree_dict.items():
if type(value) != dict:
if old_key == "":
branch += f"%{key}% {default_separator} {value} \n"
else:
branch += f"{old_key} {default_separator} /{key}/ {default_separator} {value} \n"
else:
if old_key != "":
old_key += f" {default_separator} %{key}%"
elif key != value.get(key):
old_key += f"^{key}^"
branch += print_dictionary_tree(value, default_separator, "", old_key)
return branch
退货
'a' - 1
'b' - 'c' - 1
'b' - 'd' - 4
'b' - 'e' - 'f' - 3
'b' - 'e' - 'g' - 'h' - 5
'b' - 'e' - 'g' - 'i' - 6
'b' - 'e' - 'j' - 10
我发现类似的有用链接,但我无法修复我的功能:
解决方案
Python 生成器可以快速解决这些问题 -
def traverse(d, path = []):
if isinstance(d, dict):
for (k, v) in d.items():
yield from traverse(v, [*path, k])
else:
yield [*path, d]
input = ... # <- your dict
for p in traverse(input):
print("-".join(map(str, p)))
输出 -
a-1
b-c-1
b-d-4
e-f-3
e-g-h-5
e-g-i-6
j-10
推荐阅读
- sql - 直接引用 Pivot 列允许 ISNULL
- reactjs - 在带有 JSX 的锚标记内使用图像标记
- javascript - 仅将对象数组的值推入另一个数组
- r - 将列内的字符串拆分为固定长度的子字符串
- python - Django migrate --fake-initial 报告关系已经存在
- three.js - 如何在 Autodesk Forge 中动态更新 THREE.js PointCloud 覆盖
- android - 如何在 Android 中保存和重新创建布局?
- c - 将大型 CSV 文件汇总到数组中的内存访问冲突
- java - 在某些情况下无法打印正确的结果
- solidity - 使用 web3 v1.0 发送原始交易的无效类型错误