解压嵌套字典的更简洁方法

tur*_*nip 2 python dictionary

我正在从 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)

我该如何改进?

Eri*_*nil 5

您可以使用递归函数和一些类型测试:

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)

请注意,它输出的是平面生成器,而不是列表列表。

  • @cᴏʟᴅsᴘᴇᴇᴅ:谢谢。更新 (2认同)