我有一个嵌套的(字典)和(字典列表) - 为了清楚起见,用括号 - 如下所示:
{"k":
{"hello": "bye",
"hi": [{"a": "b", "c": "d"}, {"q": "I", "o": "p"}]
}
}
我想将它压平成如下所示的路径:
"k/hello/bye/hi/a/b/c/d/q/I/o/p"
如何做到这一点?可能有更多层字典(甚至在列表中的字典中),所以我需要一个非常可扩展的解决方案。
谢谢, jack
最佳答案
递归解决方案
递归在第一次运行时几乎不起作用,我猜我很幸运:
def traverse(struct):
if isinstance(struct, dict):
return '/'.join(k+'/'+traverse(v) for k,v in struct.items())
elif isinstance(struct, list):
return '/'.join(traverse(v) for v in struct)
else:
return struct
给出:
'k/hello/bye/hi/a/b/c/d/q/I/o/p'
为什么?
对 traverse
函数的每次调用都采用一个 struct
参数,该参数可以是字典、列表或字符串。
如果是字典,我们将所有值连接在一起,然后是遍历相应键的结果。然后我们返回这个字符串。
同样,如果是列表,我们将遍历所有元素的输出连接在一起并返回结果。
最后,如果 struct
参数只是一个字符串,我们将其返回给父级。
在每种情况下,每个函数都不知道它在调用堆栈中的磨损,它只知道其 struct
参数是什么,并返回正确的响应该 ,论证。
这就是递归的厉害之处,你只需要考虑一种情况,只要你写得正确,并将正确的东西从父级传递给子级,结果就会通过合作出现。
注意正如 @DanielMeseko 在评论中指出的那样,字典没有排序,因此,例如,最终字符串的 hello
和 hi
部分可能是“交换位置”(以及他们的子树)。
更新
要使字典按键的字母位置排序,我们只需对 struct.items()
的结果使用 sorted()
函数即可。
那就是:将上面代码中的 struct.items()
替换为:
sorted(struct.items())
默认按字母顺序排序。
关于python - 用 python 中可能的字典列表展平嵌套字典,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53565504/