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
相关产品推荐
相关产品推荐

