如何在Python中实现矩阵向量的COUNT+GROUP BY统计?
用Python统计矩阵中不同向量的出现次数
其实这个需求在Python里实现起来挺简单的,核心问题是列表是可变类型,不能直接作为字典的键(字典键需要是可哈希类型),所以我们只要把每个子向量转成不可变的元组,就能用字典或者专门的计数工具来统计了。我给你分享几个常用的巧妙实现:
方法一:用collections.Counter(最简洁)
Counter是Python标准库里专门用来做计数的工具,简直是为这个需求量身定做的:
from collections import Counter matrix = [[1, 2, 3], [2, 3, 1], [1, 2, 3], [2, 3, 1], [2, 3, 1]] # 把每个子列表转成元组(元组不可变、可哈希),传给Counter统计 counted = Counter(tuple(row) for row in matrix) # 转换成你要的格式:[次数, 原向量] result = [[count, list(vec)] for vec, count in counted.items()] print(result) # 输出:[[2, [1, 2, 3]], [3, [2, 3, 1]]]
方法二:用collections.defaultdict手动统计
如果你想更灵活地控制计数过程(比如中间要加一些额外逻辑),可以用defaultdict自己实现统计逻辑:
from collections import defaultdict matrix = [[1, 2, 3], [2, 3, 1], [1, 2, 3], [2, 3, 1], [2, 3, 1]] count_dict = defaultdict(int) for row in matrix: # 同样转元组当键,每遇到一次对应向量就计数+1 count_dict[tuple(row)] += 1 # 转成目标格式 result = [[count, list(vec)] for vec, count in count_dict.items()] print(result)
额外优化:按次数排序
如果你希望结果按出现次数从高到低排列,可以给结果加个排序逻辑:
# 按次数降序排序 sorted_result = sorted(result, key=lambda x: -x[0]) print(sorted_result) # 输出:[[3, [2, 3, 1]], [2, [1, 2, 3]]]
本质上这两种方法都是利用了**哈希表(字典)**的特性,和SQL里GROUP BY + COUNT的逻辑完全一致——先把相同的向量归为一组(用哈希键区分),再统计每组的数量。
内容的提问来源于stack exchange,提问作者Snochacz
相关产品推荐
相关产品推荐

