代码之家  ›  专栏  ›  技术社区  ›  Jack Arnestad

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

  •  1
  • Jack Arnestad  · 技术社区  · 6 年前

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

    {"k": 
      {"hello": "bye",
       "hi": [{"a": "b", "c": "d"}, {"q": "I", "o": "p"}]
      }
    }
    

    我想把它展平成如下路径:

    "k/hello/bye/hi/a/b/c/d/q/I/o/p"
    

    怎么能做到?字典可能有更多的层次(甚至在列表中的层次),所以我需要一个非常可扩展的解决方案。

    谢谢, 杰克

    1 回复  |  直到 6 年前
        1
  •  4
  •   Joe Iddon    6 年前

    递归解

    递归在第一次运行时几乎不起作用,我想我很幸运:

    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 参数可以是字典、列表或字符串。

    如果它是一个字典,我们将所有值连接在一起,然后遍历相应键的结果。然后我们返回这个字符串。

    同样,如果它是一个列表,我们将遍历所有元素的输出连接在一起,并返回结果。

    最后,如果 结构 参数只是一个字符串,我们将它返回给父级。

    在任何情况下,每个函数都不知道它在调用堆栈中的磨损,它只知道它的 结构 参数为并返回正确的响应 那个 争论。

    这就是递归最酷的地方,你只需要考虑一个例子,只要你写的正确并且把正确的东西从父代传递到子代,结果就会通过合作出现。


    注意事项 @DanielMeseko 注释中的注释,字典没有排序,例如, hello hi 最后一个字符串的部分可以“切换位置”(连同它们的子树)。


    更新

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

    那是留下来的:更换 结构项() 在上述代码中:

    sorted(struct.items())
    

    默认按字母顺序排序。