You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Python中如何更优雅地扁平化含嵌套字典列表的字典列表?

更Pythonic的字典列表扁平化实现方式

我有一个字典列表,其中每个字典包含一个值为字典列表的items字段,想要将其扁平化为单层字典列表。现有可运行代码,想寻找更符合Python风格的实现方式。

原代码

from pprint import pprint

transactions = [
    {
        "Customer": "Leia",
        "Store": "Hammersmith",
        "Basket": "basket1",
        "items": [
            {"Product": "Cheddar", "Quantity": 2, "GrossSpend": 2.50},
            {"Product": "Grapes", "Quantity": 1, "GrossSpend": 3.00},
        ],
    },
    {
        "Customer": "Luke",
        "Store": "Ealing",
        "Basket": "basket2",
        "items": [
            {
                "Product": "Custard Creams",
                "Quantity": 1,
                "GrossSpend": 3.00,
            }
        ],
    },
]
flattened_transactions = []
for transaction in transactions:
    flattened_transactions.extend(
        {
            "Customer": transaction["Customer"],
            "Store": transaction["Store"],
            "Basket": transaction["Basket"],
            "Product": item["Product"],
            "Quantity": item["Quantity"],
            "GrossSpend": item["GrossSpend"],
        }
        for item in transaction["items"]
    )
pprint(flattened_transactions)

原输出

[{'Basket': 'basket1',
  'Customer': 'Leia',
  'GrossSpend': 2.5,
  'Product': 'Cheddar',
  'Quantity': 2,
  'Store': 'Hammersmith'},
 {'Basket': 'basket1',
  'Customer': 'Leia',
  'GrossSpend': 3.0,
  'Product': 'Grapes',
  'Quantity': 1,
  'Store': 'Hammersmith'},
 {'Basket': 'basket2',
  'Customer': 'Luke',
  'GrossSpend': 3.0,
  'Product': 'Custard Creams',
  'Quantity': 1,
  'Store': 'Ealing'}]

优化实现方式

方式1:字典解包+生成器(兼顾可读性与扩展性)

这种方式避免硬编码所有公共字段,当原transaction字典新增字段时,无需修改扁平化代码:

from pprint import pprint

transactions = [
    # 同原代码的transactions定义
]

flattened = []
for txn in transactions:
    # 提取除items外的所有公共字段
    base_fields = {k: v for k, v in txn.items() if k != "items"}
    # 用字典解包合并公共字段与每个item
    flattened.extend({**base_fields, **item} for item in txn["items"])

pprint(flattened)

方式2:嵌套列表推导式(更紧凑)

如果场景简单,也可以用一行列表推导式完成,代码更简洁:

flattened = [
    {**{k: v for k, v in txn.items() if k != "items"}, **item}
    for txn in transactions
    for item in txn["items"]
]
pprint(flattened)

优化点说明

  • 避免了手动逐个键赋值的重复代码,减少出错概率
  • 无需硬编码键名,扩展性更强:原字典新增字段时,扁平化结果会自动包含该字段
  • 使用**字典解包是Python特有的简洁语法,更符合Pythonic风格

内容的提问来源于stack exchange,提问作者jamiet

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.10 04:35:28