python - 用 python 中可能的字典列表展平嵌套字典

标签 python string dictionary recursion

我有一个嵌套的(字典)和(字典列表) - 为了清楚起见,用括号 - 如下所示:

{"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 在评论中指出的那样,字典没有排序,因此,例如,最终字符串的 hellohi 部分可能是“交换位置”(以及他们的子树)。


更新

要使字典按键的字母位置排序,我们只需对 struct.items() 的结果使用 sorted() 函数即可。

那就是:将上面代码中的 struct.items() 替换为:

sorted(struct.items())

默认按字母顺序排序。

关于python - 用 python 中可能的字典列表展平嵌套字典,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53565504/

相关文章:

使用 Pandas 进行 Python 字典理解

dictionary - dict 从嵌套字典中获取 dict,在 tcl 中创建一个副本?

javascript - 在 javascript JSON 中添加字符串作为键

javascript - 如何将数组中的数组转换为字符串?

python - 检查字典中是否存在键列表

python - 将 python int 解析为 Mysql unsigned TINYINT

python - 如何避免pyspark中join操作的过度shuffle?

python - 将连接的组件分离到多个图像

python - 在Python turtle 中使用while循环控制游戏

c - 我无法检索主函数中的更新值