使用set.difference()触发TypeError: unhashable type 'list'报错如何解决
报错根源
set 要求内部存储的所有元素必须是**可哈希(hashable)**的类型,Python中常见的可变类型(比如列表、字典、集合本身)都不满足可哈希要求。你触发报错的原因是self.reactions或者already_in中包含了列表类型的元素,和列表是否为空没有任何关联。
从你后续遍历取role[1]的逻辑可以看出,你存储的每个反应项本身是列表结构,所以直接塞进set自然会触发类型错误。
修复方案
你可以先把所有子列表转为可哈希的元组,再进行差集计算,示例修改如下:
assert self.model is not None assert self.reactions is not None already_in = self.get_roles() assert already_in is not None # 先把列表元素转元组再做集合运算 set_reactions = set(tuple(item) for item in self.reactions) set_already_in = set(tuple(item) for item in already_in) reactions_to_push = [list(item) for item in set_reactions.difference(set_already_in)] for role in reactions_to_push: await self.original_message.add_reaction(role[1])
如果你的差集判断只需要比对反应标识(也就是role[1]对应的值),也可以单独抽这个字段做比对,效率更高:
# 先提取已存在的反应标识集合 existed_reactions = set(item[1] for item in already_in) # 过滤出不在已存在集合里的反应项 reactions_to_push = [item for item in self.reactions if item[1] not in existed_reactions] for role in reactions_to_push: await self.original_message.add_reaction(role[1])
内容的提问来源于stack exchange,提问作者Moder New
相关产品推荐
相关产品推荐

