我想创建一个函数来递归遍历多维字典,其中维度是未知的.
这是我到目前为止所提出的,但它似乎没有正常工作.这将打印出一些键/值两次,它们不是有序的.
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)
归档时间: |
|
查看次数: |
16029 次 |
最近记录: |