【问题标题】:recursively iterate nested python dictionary递归迭代嵌套的python字典
【发布时间】:2016-10-20 05:54:52
【问题描述】:

我有这样的嵌套 python 字典。

d = {}
d[a] = b
d[c] = {1:2, 2:3}

我正在尝试将嵌套字典递归转换为 xml 格式,因为内部可以有更多嵌套字典,例如 d[e] = {1:{2:3}, 3:4}。我想要的 XML 格式是这样的

<root>
  <a>b</a>
  <c>
    <1>2</1> 
    <2>3</3>
  </c> 
</root>

到目前为止,我有这个 python 代码来处理使用 lxml 库的嵌套 xml。但它并没有给我想要的输出。

def encode(node, Dict):  
  if len(Dict) == 0:  
    return node 
  for kee, val in Dict.items():  
    subNode = etree.SubElement(node, kee) 
    del msgDict[kee]  
    if not isinstance(val, dict): 
      subNode.text = str(val) 
    else: 
      return encode(subNode, val)

感谢任何帮助。谢谢你。

【问题讨论】:

  • 你看过这个答案吗? stackoverflow.com/questions/1019895/…
  • 是的,我做到了。但我试图编写本机方法而不是使用外部库。它应该相当简单,但我的递归思维有点差。
  • 你的想法是对的。如果当前元素是另一个你想要递归的字典,如果它是一个元素然后写出它的值。你得到的输出是什么?

标签: python xml dictionary recursion lxml


【解决方案1】:

您回忆编码的方式看起来不正确。也许这有帮助。为简单起见,我只是将内容附加到一个列表(称为l)。相反,您应该使用etree.SubElement(...)

def encode(D, l=[]):
    for k, v in D.items():
        if isinstance(v, dict):
            l2 = [k]
            encode(v, l2)
            l.append(l2)
        else:
            l.append([k, v])

【讨论】:

  • 我明白了。它也有效。但是我正在处理很多键值对,并且来回将它们转换为列表和字典将非常耗时。
【解决方案2】:

我在我的代码中发现了错误,即我没有将递归调用返回到原始循环。进入嵌套元素后,它“返回”并且不会回到原始循环。而不是return encode(subNode, val),保存在变量element = encode(subNode, val) 中解决了这个问题。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-01-21
    • 2021-12-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-08-05
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多