You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.25 02:15:01