【问题标题】:Flattening nested dictionary with possible list of dictionaries in python用python中可能的字典列表展平嵌套字典
【发布时间】:2019-05-03 01:54:38
【问题描述】:

我有一个嵌套的 (dictionaries) 和 (list of dictionaries) - 为了清楚起见,用括号括起来 - 如下所示:

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

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

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

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

谢谢, 杰克

【问题讨论】:

  • 一般字典没有排序,所以不能保证准确的字符串
  • 你标记了递归,所以你显然有一个想法,你在哪里卡住了?
  • @DanielMesejo。他们现在……
  • @DanielMesejo 假设我们只是按字母顺序对键进行排序以确保顺序相同。那怎么办?
  • @JackArnestad 叶子元素之一是否可以是列表,例如 { 'a':[1, 2, 3] } 是否允许?

标签: python string dictionary recursion


【解决方案1】:

递归解

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

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 参数是什么,并为 that 参数返回正确的响应。 p>

这就是递归的酷炫之处,你只需要考虑一种情况,只要你写得正确,把正确的东西从父母传给孩子,结果就是通过合作而出现的。


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


更新

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

即留下:将上面代码中的struct.items()替换为:

sorted(struct.items())

默认按字母顺序排序。

【讨论】:

  • 谢谢!有没有办法让它按字母顺序来确定顺序?
猜你喜欢
  • 1970-01-01
  • 2019-05-09
  • 2019-08-25
  • 1970-01-01
  • 1970-01-01
  • 2019-02-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多