【发布时间】:2019-03-04 16:36:49
【问题描述】:
我有一个 Python 对象,它具有多层字典和列表,其中包含我需要从中获取值的键。我使用递归生成器找到了一个answer,它允许我提取一个键的值,但不能提取多个键的值。代码如下:
with open('data.json') as f:
json_data = json.load(f)
def find_key(obj, key):
if isinstance(obj, dict):
yield from iter_dict(obj, key, [])
elif isinstance(obj, list):
yield from iter_list(obj, key, [])
def iter_dict(d, key, indices):
for k, v in d.items():
if k == key:
yield indices + [k], v
if isinstance(v, dict):
yield from iter_dict(v, key, indices + [k])
elif isinstance(v, list):
yield from iter_list(v, key, indices + [k])
def iter_list(seq, key, indices):
for k, v in enumerate(seq):
if isinstance(v, dict):
yield from iter_dict(v, key, indices + [k])
elif isinstance(v, list):
yield from iter_list(v, key, indices + [k])
for c in find_key(json_data, 'customer_count'):
print(c)
结果:
(['calendar', 'weeks', 0, 'days', 1, 'availabilities', 0, 'customer_count'], 14)
(['calendar', 'weeks', 0, 'days', 2, 'availabilities', 0, 'customer_count'], 7)
另一个post 有一个提取多个键的示例,但不会递归整个对象:
[...]
keys = ("customer_count", "utc_start_at", "non_resource_bookable_capacity")
for k in keys:
keypath, val = next(find_key(json_data, k))
print("{!r}: {!r}".format(k, val))
结果:
'customer_count': 14
'utc_start_at': '2018-09-29T16:45:00+0000'
'non_resource_bookable_capacity': 18
如何遍历整个对象并提取上面显示的三个键?
我想要的结果应该是这样的:
'customer_count': 14
'utc_start_at': '2018-09-29T16:45:00+0000'
'non_resource_bookable_capacity': 18
'customer_count': 7
'utc_start_at': '2018-09-29T16:45:00+0000'
'non_resource_bookable_capacity': 25
【问题讨论】:
-
那么你想要的结果是什么?你能编辑并显示你的最终结果应该是什么样子吗?
标签: python json dictionary nested