递归遍历多维字典,维度未知

imn*_*mns 11 python

我想创建一个函数来递归遍历多维字典,其中维度是未知的.

这是我到目前为止所提出的,但它似乎没有正常工作.这将打印出一些键/值两次,它们不是有序的.

def walk_dict(d):
    for k,v in d.items():
        if isinstance(v, dict):
            walk_dict(v)
        else:
            print "%s %s" % (k, v) 
Run Code Online (Sandbox Code Playgroud)

这是一个示例数组:

d = {
        'plan_code': 'b',
        'quantity': '1',
        'account': {
            'account_code': 'b',
            'username': 'jdoe',
            'email': 'jdoe@domain.com',
            'first_name': 'b',
            'last_name': 'b',
            'company_name': 'Company, LLC.',
            'billing_info': {
                'first_name': 'b',
                'last_name': 'b',
                'address1': '123 Test St',
                'city': 'San Francisco',
                'state': 'CA',
                'country': 'US',
                'zip': '94105',
                'credit_card': {
                    'number': '1',
                    'year': '2018',
                    'month': '12',
                    'verification_value': '123',
                },
            },
        },
    }
Run Code Online (Sandbox Code Playgroud)

Jus*_*eel 14

我不确定你的最终目标是什么,但代码正在做它应该做的事情.您正在看到您认为重复项目的内容,因为有'first_name'这样的键/值组合:'b'都在'account'内,'billing_info'在'account'中.我不确定你要找的是什么订单,但字典是无序的,所以你打印它们的功能必须给它们一些顺序,例如通过替换以下内容:

for k,v in d.items():
Run Code Online (Sandbox Code Playgroud)

for k,v in sorted(d.items(),key=lambda x: x[0]):
Run Code Online (Sandbox Code Playgroud)

或者你需要一个有序的字典.你也可以像这样使用pprint模块给出一个很好的dict打印:

>>> import pprint
>>> pprint.pprint(d)
{'account': {'account_code': 'b',
             'billing_info': {'address1': '123 Test St',
                              'city': 'San Francisco',
                              'country': 'US',
                              'credit_card': {'month': '12',
                                              'number': '1',
                                              'verification_value': '123',
                                              'year': '2018'},
                              'first_name': 'b',
                              'last_name': 'b',
                              'state': 'CA',
                              'zip': '94105'},
             'company_name': 'Company, LLC.',
             'email': 'jdoe@domain.com',
             'first_name': 'b',
             'last_name': 'b',
             'username': 'jdoe'},
 'plan_code': 'b',
 'quantity': '1'}
Run Code Online (Sandbox Code Playgroud)

但是,我不完全确定你的最终目标是什么.此外,当值为词典时,您缺少键.我修改了你的代码,使其与pprint在下面的内容做了类似的事情:

def walk_dict(d,depth=0):
    for k,v in sorted(d.items(),key=lambda x: x[0]):
        if isinstance(v, dict):
            print ("  ")*depth + ("%s" % k)
            walk_dict(v,depth+1)
        else:
            print ("  ")*depth + "%s %s" % (k, v) 
Run Code Online (Sandbox Code Playgroud)

对于你的例子dict产生:

>>> walk_dict(d)
account
  account_code b
  billing_info
    address1 123 Test St
    city San Francisco
    country US
    credit_card
      month 12
      number 1
      verification_value 123
      year 2018
    first_name b
    last_name b
    state CA
    zip 94105
  company_name Company, LLC.
  email jdoe@domain.com
  first_name b
  last_name b
  username jdoe
plan_code b
quantity 1
Run Code Online (Sandbox Code Playgroud)


Chr*_*son 5

import json
print(json.dumps(d, indent=4))
Run Code Online (Sandbox Code Playgroud)