【问题标题】:How to recursively iterate complex python object?如何递归迭代复杂的python对象?
【发布时间】:2020-01-05 09:35:07
【问题描述】:

我有这样的对象:

et = {  
    "applications": [
        {
        "applications_application": 'value',
        "application_journalNumber": 'value',
        "appParticipants": [
            {
                "appParticipant_inn": "value",
                "appParticipant_kpp": "value",
                "legalForm_code": "value"
            }
            ]
        }
    ]
}

我需要递归遍历它的所有键。我该怎么做?我想得到类似的东西:

applications
applications_application
application_journalNumber
appParticipants
appParticipant_inn
appParticipant_kpp
legalForm_code

我不工作的解决方案:

def myprint(d):
    for k, v in d.items():
      if isinstance(v, dict):
        myprint(v)
      else:
        if isinstance(v, list):
            myprint(v[0])

附:每个数组中只有一项。

【问题讨论】:

  • 这是 json 对象,不是 Python。您首先使用 json 模块中的方法将其转换为 Dictionary。
  • 什么不起作用?你有结果或堆栈跟踪吗?您当前的实现没有结束条件,我猜在您的情况下应该是print()

标签: python


【解决方案1】:

怎么样:

def traverse_dict(d):
    keys = []
    for key, item in d.items():
        keys.append(key)
        if isinstance(item, dict):
            keys.extend(traverse_dict(item))
        elif isinstance(item, list):
            for d in item:
                keys.extend(traverse_dict(d))
    return keys

【讨论】:

    【解决方案2】:

    您可以将递归与生成器一起使用:

    def _keys(d):
      for a, b in d.items():
        yield a
        if isinstance(b, dict):
          yield from _keys(b)
        if isinstance(b, list):
          for i in b:
             yield from _keys(i)
    
    
    et = {'applications': [{'applications_application': 'value', 'application_journalNumber': 'value', 'appParticipants': [{'appParticipant_inn': 'value', 'appParticipant_kpp': 'value', 'legalForm_code': 'value'}]}]}
    print('\n'.join(_keys(et)))
    

    输出:

    applications
    applications_application
    application_journalNumber
    appParticipants
    appParticipant_inn
    appParticipant_kpp
    legalForm_code
    

    【讨论】:

      【解决方案3】:

      你离可行的解决方案不远了,我可以向你推荐这个:

      def myprint(d):
          # print("Handling %s" % d)  # Debug logging
      
          # This is the end condition on which you actually print the entry
          if not isinstance(d, dict):
              print("Entry: %s" % d)
          else:
              for k, v in d.items():
                  # print("Handling key: %s - value: %s" % (k, v))  # Debug logging
                  if isinstance(v, list):
                      myprint(v[0])
                  else:
                      myprint(k) # replace by myprint(v) to show the values 
      

      这将打印在字典中找到的所有值。

      输出如下:

      Entry: applications_application
      Entry: application_journalNumber
      Entry: appParticipant_inn
      Entry: appParticipant_kpp
      Entry: legalForm_code
      
      

      【讨论】:

        猜你喜欢
        • 2023-03-08
        • 1970-01-01
        • 2011-01-13
        • 2018-08-19
        • 1970-01-01
        • 2015-06-04
        • 1970-01-01
        • 2020-05-14
        • 2023-03-24
        相关资源
        最近更新 更多