我想创建一个函数来递归遍历维度未知的多维字典。
这是我到目前为止的想法,但它似乎无法正常工作。这将打印出一些键/值两次,并且它们没有顺序。
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/