我正在从 JSON 格式的 API 批量接收数据。我希望仅将值存储在列表中。
原始数据看起来像这样,并且总是像这样,即: all {...} 看起来像第一个示例:
data = content.get('data')
>>> [{'a':1, 'b':{'c':2, 'd':3}, 'e':4}, {...}, {...}, ...]
Run Code Online (Sandbox Code Playgroud)
嵌套字典使这变得更加困难;我也需要这个解压。
这是我所拥有的,它有效,但感觉很糟糕:
unpacked = []
data = content.get('data')
for d in data:
item = []
for k, v in d.items():
if k == 'b':
for val in v.values():
item.append(val)
else:
item.append(v)
unpacked.append(item)
Run Code Online (Sandbox Code Playgroud)
输出:
>>> [[1,2,3,4], [...], [...], ...]
Run Code Online (Sandbox Code Playgroud)
我该如何改进?
您可以使用递归函数和一些类型测试:
data = [{'a':1, 'b':{'c':2, 'd':3}, 'e':4}, {'f':5,'g':6}]
def extract_nested_values(it):
if isinstance(it, list):
for sub_it in it:
yield from extract_nested_values(sub_it)
elif isinstance(it, dict):
for value in it.values():
yield from extract_nested_values(value)
else:
yield it
print(list(extract_nested_values(data)))
# [1, 2, 3, 4, 5, 6]
Run Code Online (Sandbox Code Playgroud)
请注意,它输出的是平面生成器,而不是列表列表。