如何对Odoo记录集按字典键分组生成新字典?含示例需求
这其实是个很常见的分组需求,结合Python的工具和Odoo记录集的特性就能轻松搞定——Odoo的记录对象是可哈希的,完全可以直接作为分组键使用。下面给你两种靠谱的实现方案:
方案一:用
itertools.groupby(适合需要按partner排序的场景) groupby是Python标准库的工具,不过要注意它只会对连续的相同元素分组,所以第一步需要先按partner字段排序:
from itertools import groupby # 你的原始数据 original_list = [ {'partner': res.partner(985,), 'account_id': account.account(193,), 'price_total': 420.0}, {'partner': res.partner(985,), 'account_id': account.account(194,), 'price_total': 260.0}, {'partner': res.partner(985,), 'account_id': account.account(95,), 'price_total': 600.0} ] # 先按partner排序,确保相同partner的条目连在一起 sorted_list = sorted(original_list, key=lambda x: x['partner']) # 分组并构造目标格式 dict_list = [] for partner, group in groupby(sorted_list, key=lambda x: x['partner']): # 提取每组的account_id和price_total组成data列表 data_items = [{'account_id': item['account_id'], 'price_total': item['price_total']} for item in group] dict_list.append({'partner_id': partner, 'data': data_items})
方案二:手动用字典分组(适合无需排序、追求效率的场景)
如果不需要分组结果按partner排序,直接用字典存分组会更高效,还能避免排序的额外开销:
# 你的原始数据 original_list = [ {'partner': res.partner(985,), 'account_id': account.account(193,), 'price_total': 420.0}, {'partner': res.partner(985,), 'account_id': account.account(194,), 'price_total': 260.0}, {'partner': res.partner(985,), 'account_id': account.account(95,), 'price_total': 600.0} ] # 先按partner分组存字典 grouped_data = {} for item in original_list: partner = item['partner'] # 如果partner不在字典里,先初始化空列表 if partner not in grouped_data: grouped_data[partner] = [] # 添加当前条目的account和price信息 grouped_data[partner].append({'account_id': item['account_id'], 'price_total': item['price_total']}) # 转换为你需要的列表格式 dict_list = [{'partner_id': p, 'data': d} for p, d in grouped_data.items()]
两种方案运行后,dict_list都会生成你期望的结果。如果原始列表里有多个不同的partner,代码也会自动为每个partner生成对应的分组项。
内容的提问来源于stack exchange,提问作者user2655334
相关产品推荐
相关产品推荐

