【问题标题】:How to iterate over an OrderedDict in an OrderedDict如何在 OrderedDict 中迭代 OrderedDict
【发布时间】:2018-02-25 05:59:14
【问题描述】:

您好,我想解析一些 order_dicts。我有以下错误

ipdb> for elem in my_orderdict['codeBook'].keys():
          print("{0}  ===> {1}".format(elem, my_orderdict[elem ]))
*** KeyError: '@xmlns'

假设我创建了一个 Orderdict,稍后我想对其进行迭代以获取每个项目和值。

ipdb >>> from collections import *
ipdb >>> my_orderdict = \
OrderedDict([('codeBook',
    OrderedDict([('@xmlns', 'http://www.johndoe.com'),
         ('@xmlns:xsi',
          'http://www.w3.org/2001/XMLSchema-instance'),
         ('@version', '1.2.2'),
         ('@ID', '_71M0001XCB-F-1991-novembre'),
         ('@xml-lang', 'en'),
         ('@xsi:schemaLocation', 'http://www.johndoe.xsd'),
         ('stdyDscr',
          OrderedDict([('stdyInfo',
              OrderedDict([('subject',
                  OrderedDict([('keyword',
                                ['Chômage',
                                 'Emploi'])]))]))]))]))])

ipdb >>> type(my_orderdict)
<class 'collections.OrderedDict'>

ipdb >>>  my_orderdict['codeBook'].keys()
odict_keys(['@xmlns', '@xmlns:xsi', '@version', 
            '@ID', '@xml-lang', '@xsi:schemaLocation', 'stdyDscr'])

我正在创建一个循环来访问每个 odict_keys 的值

for elem in my_orderdict['codeBook'].keys():
    print("{0}  ===> {1}".format(elem, my_orderdict[elem ]))

我想要的结果应该是

@xmlns ===> 'http://www.johndoe.com'
@xmlns:xsi ===> 'http://www.w3.org/2001/XMLSchema-instance'
@version ===> 1.2.2
...

这样我就可以解析这个 orderdict。现在我的错误是:

ipdb> for elem in my_orderdict['codeBook'].keys():
          print("{0}  ===> {1}".format(elem, my_orderdict[elem ]))
*** KeyError: '@xmlns'

所以我无法访问我的第一个 orderdict 的属性。

【问题讨论】:

    标签: python python-3.x ordereddictionary


    【解决方案1】:

    看起来您的循环没有访问正确的字典。您应该使用:

    for elem in my_orderdict['codeBook'].keys():
        print("{0}  ===> {1}".format(elem, my_orderdict['codeBook'][elem ]))
    

    注意内部循环中的my_orderdict['codeBook']

    基本上:您正在迭代字典 my_orderdict['codeBook'] 的元素,但尝试直接访问 my_orderdict 的值。

    希望这会有所帮助!

    【讨论】:

      【解决方案2】:

      您正在迭代子字典的键:for elem in my_orderdict['codeBook'].keys():,但随后在父字典上使用这些键:my_orderdict[elem ] 您需要使用my_orderdict['codeBook'],所以:

      In [2]: data = OrderedDict([('codeBook',
         ...:     OrderedDict([('@xmlns', 'http://www.johndoe.com'),
         ...:          ('@xmlns:xsi',
         ...:           'http://www.w3.org/2001/XMLSchema-instance'),
         ...:          ('@version', '1.2.2'),
         ...:          ('@ID', '_71M0001XCB-F-1991-novembre'),
         ...:          ('@xml-lang', 'en'),
         ...:          ('@xsi:schemaLocation', 'http://www.johndoe.xsd'),
         ...:          ('stdyDscr',
         ...:           OrderedDict([('stdyInfo',
         ...:               OrderedDict([('subject',
         ...:                   OrderedDict([('keyword',
         ...:                                 ['Chômage',
         ...:                                  'Emploi'])]))]))]))]))])
      
      In [3]: for elem in data['codeBook']: #note, call to .keys is not necessary
         ...:     print("{0} ===> {1}".format(elem, data['codeBook'][elem]))
         ...:
      @xmlns ===> http://www.johndoe.com
      @xmlns:xsi ===> http://www.w3.org/2001/XMLSchema-instance
      @version ===> 1.2.2
      @ID ===> _71M0001XCB-F-1991-novembre
      @xml-lang ===> en
      @xsi:schemaLocation ===> http://www.johndoe.xsd
      stdyDscr ===> OrderedDict([('stdyInfo', OrderedDict([('subject', OrderedDict([('keyword', ['Chômage', 'Emploi'])]))]))])
      

      但是,在这种情况下,您可以只使用 items,它会迭代键值对pairs

      In [4]: for k, v  in data['codeBook'].items():
         ...:     print("{0} ===> {1}".format(k, v))
         ...:
      @xmlns ===> http://www.johndoe.com
      @xmlns:xsi ===> http://www.w3.org/2001/XMLSchema-instance
      @version ===> 1.2.2
      @ID ===> _71M0001XCB-F-1991-novembre
      @xml-lang ===> en
      @xsi:schemaLocation ===> http://www.johndoe.xsd
      stdyDscr ===> OrderedDict([('stdyInfo', OrderedDict([('subject', OrderedDict([('keyword', ['Chômage', 'Emploi'])]))]))])
      

      【讨论】:

      • 感谢您的回答!
      猜你喜欢
      • 2014-01-25
      • 2013-05-09
      • 2015-09-28
      • 1970-01-01
      • 1970-01-01
      • 2013-05-18
      • 2011-12-23
      • 2021-10-29
      • 2015-09-19
      相关资源
      最近更新 更多