如何用Python推导式合并列表中同id的字典account_id值?
按id合并account_id列表的推导式实现方案
示例输入
a = [ {'id': 977950, 'account_id': u'BKDFIU'}, {'id': 45637, 'account_id': u'FGDG'}, {'id': 764325, 'account_id': u'HGDER$Y'}, {'id': 1011243, 'account_id': u'REW$LP'}, {'id': 1022741, 'account_id': u'YUFDNGFN'}, {'id': 45637, 'account_id': None}, {'id': 764325, 'account_id': u'HGDERYTH'} ]
目标输出
{ 977950: [u'BKDFIU'], 45637: [u'FGDG', None], 764325: [u'HGDER$Y', u'HGDERYTH'], 1011243: [u'REW$LP'], 1022741: [u'YUFDNGFN'] }
实现方案
方案1:高效简洁的非纯推导式写法(推荐大量数据使用)
借助collections.defaultdict快速完成分组,时间复杂度O(n),无需排序:
from collections import defaultdict result = defaultdict(list) for item in a: result[item['id']].append(item['account_id']) # 可选:转换为普通字典 result = dict(result)
方案2:纯字典推导式写法
如果一定要用推导式实现,可以结合itertools.groupby,但必须先按id排序(groupby仅对连续相同键分组),时间复杂度O(n log n):
from itertools import groupby from operator import itemgetter # 先按id排序 sorted_items = sorted(a, key=itemgetter('id')) # 字典推导式完成分组 result = { group_id: [item['account_id'] for item in group] for group_id, group in groupby(sorted_items, key=itemgetter('id')) }
方案对比
- 方案1:无需排序,性能更优,写法直观,适合处理大规模数据。
- 方案2:严格使用推导式实现,但依赖排序,数据量极大时性能略逊于方案1。
内容的提问来源于stack exchange,提问作者SudipM
相关产品推荐
相关产品推荐

