python - 递归遍历多维字典,维数未知

标签 python

我想创建一个函数来递归遍历维度未知的多维字典。

这是我到目前为止的想法,但它似乎无法正常工作。这将打印出一些键/值两次,并且它们没有顺序。

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

这是一个示例数组:

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',
                },
            },
        },
    }

最佳答案

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

for k,v in d.items():

for k,v in sorted(d.items(),key=lambda x: x[0]):

或者你需要一本有序的字典。你也可以像这样使用 pprint 模块来打印一个漂亮的字典:

>>> 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'}

但是,我不确定您的最终目标是什么。此外,当值是字典时,您会丢失键。我修改了您的代码以执行与 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) 

对于您的示例 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

关于python - 递归遍历多维字典,维数未知,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3860813/

相关文章:

python - 类型错误 : __init__() got an unexpected keyword argument 'current_app'

python - 如果我们在生成器对象引发 'StopIteration' 异常之前停止迭代会发生什么

python - 构建可执行文件时 Py2exe 错误

php - 更快的图像处理。

python - 如何在 python 中引用 Kivy Canvas

python - MATLAB 有什么用?为什么大学如此使用它?什么时候比 Python 更好?

pythonw.exe 没有响应

python - 如何在 python 中通过 ssh 运行 telnet

python - 系列的真值不明确

python - 如何删除 docker 镜像的多个标签(除了一个标签)