如何统计列表中包含数组的唯一元组数量?转set报unhashable错误
报错原因
Python的set要求存储的元素必须是*可哈希(hashable)*的类型,核心要求是对应类型不可变。你遇到的报错有两个明确原因:
- 你预期列表元素为元组,但实际存在元素为列表的情况(你贴出的真实数据样例单个元素使用
[]方括号包裹,列表本身就是不可哈希类型) - 即使元素为元组,元组内包含的numpy
array数组属于可变类型,本身也不支持哈希计算
解决方案
下面提供两种适配不同场景的实现方案:
方法1:转可哈希元组统计(精度无损失)
将每个元素内的numpy数组先转为可哈希的元组类型,再存入set统计唯一值,适合数据量不大的场景,不会出现判断误差:
unique_container = set() for pair in pair_list: # 先强制把外层转为元组避免原数据为列表的问题,再把每个array拉平后转元组 hashable_pair = tuple(tuple(arr.flatten()) for arr in tuple(pair)) unique_container.add(hashable_pair) # 输出唯一元组的数量 print(len(unique_container))
如果你的数组都是一维结构,可以去掉flatten()方法,直接转元组即可。
方法2:哈希摘要统计(适合大尺寸数组)
如果单个数组的元素量很大,转元组的运行开销过高,可以计算数组的哈希摘要后再进行统计:
import hashlib def calc_arr_hash(arr): # 把数组二进制内容转为sha256摘要 return hashlib.sha256(arr.tobytes()).digest() unique_container = set() for pair in pair_list: hashable_pair = tuple(calc_arr_hash(arr) for arr in tuple(pair)) unique_container.add(hashable_pair) print(len(unique_container))
该方法运行效率更高,仅存在理论级别的极低概率哈希碰撞风险,日常使用场景下完全可以忽略。
内容的提问来源于stack exchange,提问作者D4w1d
相关产品推荐
相关产品推荐

