如何递归迭代有序字典?

时间:2015-04-04 17:13:44

标签: python python-2.7 recursion

我有以下XML文件:

<?xml version="1.0"?>
<catalog>
   <book id="bk101">
      <author a_id="a101">
        <first>Gambardella </first>
        <last> Matthew</last>
        <email> matthew@standford.org</email>
      </author>
      <title>XML Developer's Guide</title>
      <genre>Computer</genre>
      <price>44.95</price>
      <publish_date>2000-10-01</publish_date>
      <description>An in-depth look at creating applications
      with XML.</description>
   </book>
   <book id="bk112">
      <author a_id='a007'>
        <first>Galos</first>
        <last> Mike</last>
        <email>mike@gmail.com</email>
    </author>
      <title>Visual Studio 7: A Comprehensive Guide</title>
      <genre>Computer</genre>
      <price>49.95</price>
      <publish_date>2001-04-16</publish_date>
      <description>Microsoft Visual Studio 7 is explored in depth,
      looking at how Visual Basic, Visual C++, C#, and ASP+ are
      integrated into a comprehensive development
      environment.</description>
   </book>
</catalog>

我已使用xmltodict模块将文件转换为字典,该模块返回有序字典。该词典包含字典中的词典作为值。

from xmltodict import parse
data=open(file_name).read().replace('\n', '')
xml_dict = parse(data)

现在,我希望以递归方式将xml_dict以“key :: value”格式打印到给定深度。

任何人都可以告诉我如何以递归方式迭代这个字典。

我试过了代码:

def print_dict(_dict):
   for k, v in _dict.items():
    if hasattr(v, 'items'):
           print_dict(v)
    elif isinstance(v, list):
        for i in v:
            print_dict(dict(i))
    else:
            print "(%s::%s)"%(k,v)

但是这个代码簿标签丢失了。

那么,这将是什么解决方案.......

1 个答案:

答案 0 :(得分:3)

我认为问题在于您在递归情况下没有使用k键值。我不确切地知道您希望输出的外观,但我怀疑您可以通过向ifelif块添加打印语句来使其工作。

这是一个通过添加可选的“缩进”参数使输出更加美观的版本:

def print_dict(_dict, indent=""):
    for k, v in _dict.items():
        if hasattr(v, 'items'):
            print "%s(%s::" % (indent, k)
            print_dict(v, indent + "  ")
            print "%s)" % indent
        elif isinstance(v, list):
            print "%s(%s::" % (indent, k)
            for i in v:
                print_dict(dict(i), indent + "  ")
            print "%s)" % indent
        else:
            print "%s(%s::%s)" % (indent, k, v)