如何在Python中使用Counter处理字典列表并实现分组?
按字典列表指定字段分组的实现方案
先回顾你之前处理普通列表的分组逻辑:
将现有普通列表
N = [1, 2, 2, 3, 3, 3, 4, 4, 4, 4, 5, 5, 5, 5, 5],可通过以下代码按相同值分组:N = [1, 2, 2, 3, 3, 3, 4, 4, 4, 4, 5, 5, 5, 5, 5] from collections import Counter C = Counter(N) print([[k, ] * v for k, v in C.items()])执行后得到结果:
[[1],[2,2],[3,3,3],[4,4,4,4],[5,5,5,5,5]]。
现在你需要对这个字典列表按value字段做类似分组:
N = [ {'doc':'A','value':300,'W':1}, {'doc':'B','value':301,'W':0.5}, {'doc':'C','value':301,'W':0.45}, {'doc':'D','value':301,'W':0.3}, {'doc':'E','value':300,'W':1}, ]
这里给你两种实用的实现方法,都能达到和普通列表分组一致的逻辑效果:
方法一:用defaultdict直观分组
这种方法逻辑简单易懂,先把同value的字典统一收集,再转换成目标格式:
from collections import defaultdict N = [ {'doc':'A','value':300,'W':1}, {'doc':'B','value':301,'W':0.5}, {'doc':'C','value':301,'W':0.45}, {'doc':'D','value':301,'W':0.3}, {'doc':'E','value':300,'W':1}, ] # 初始化一个默认值为列表的字典,用来存分组结果 grouped_dict = defaultdict(list) for item in N: # 以字典的value字段作为分组键,把当前字典加入对应分组 grouped_dict[item['value']].append(item) # 转换成你需要的列表格式 result = list(grouped_dict.values()) print(result)
执行后输出:
[ [{'doc': 'A', 'value': 300, 'W': 1}, {'doc': 'E', 'value': 300, 'W': 1}], [{'doc': 'B', 'value': 301, 'W': 0.5}, {'doc': 'C', 'value': 301, 'W': 0.45}, {'doc': 'D', 'value': 301, 'W': 0.3}] ]
方法二:用itertools.groupby分组
注意groupby需要先对列表按分组字段排序,否则不连续的同值项会被分成多个组,代码如下:
from itertools import groupby N = [ {'doc':'A','value':300,'W':1}, {'doc':'B','value':301,'W':0.5}, {'doc':'C','value':301,'W':0.45}, {'doc':'D','value':301,'W':0.3}, {'doc':'E','value':300,'W':1}, ] # 先按value字段排序,确保同值项连续 sorted_N = sorted(N, key=lambda x: x['value']) # 按value字段分组 grouped_data = groupby(sorted_N, key=lambda x: x['value']) # 把分组后的迭代器转换成列表格式 result = [list(group) for _, group in grouped_data] print(result)
执行后得到的结果和方法一完全一致。
如果你的需求是保留字典内容的分组,这两种方法都能完美满足;要是你只是想模仿普通列表输出“键重复对应次数”的结构,只需要把代码里的append(item)改成append(item['value'])即可。
内容的提问来源于stack exchange,提问作者Abiud Rds
相关产品推荐
相关产品推荐

