如何检测类中按键绑定列表里的重复子列表?
问题原因
你遇到的unhashable type: 'list'错误,是因为列表(list)属于可变类型,无法被哈希,而集合(set)的元素必须是可哈希类型,所以直接将子列表放入set会触发报错。
解决方案
由于你的子列表满足元素唯一、顺序无关的条件,只需把每个子列表转换成可哈希的类型,就能用set检测重复了,以下是两种可行方法:
方法1:使用frozenset(推荐)
frozenset是不可变的集合类型,天然忽略元素顺序,完全匹配你的需求。将每个子列表转成frozenset后,元素组合相同的子列表会被识别为同一个对象:
unique_binds = set(frozenset(bind) for bind in self.key_bind_list) if len(self.key_bind_list) != len(unique_binds): # 存在重复的按键绑定 pass else: # 无重复 pass
方法2:使用排序后的tuple
如果更习惯序列类型的操作,可以先对子列表排序,再转成不可变的tuple。排序后,元素顺序不同但组合相同的子列表会变成完全一致的tuple:
unique_binds = set(tuple(sorted(bind)) for bind in self.key_bind_list) if len(self.key_bind_list) != len(unique_binds): # 存在重复的按键绑定 pass else: # 无重复 pass
效果验证
针对你的测试列表[["A", "B"], ["C"], ["SHIFT", "NUM6", "NUM7"], ["A", "B"], ["A", "B", "C"]],两种方法都会精准识别["A", "B"]为重复项,同时判定["A", "B"]与["A", "B", "C"]为不同项,完全符合你的需求。
内容的提问来源于stack exchange,提问作者Giordano Souza
相关产品推荐
相关产品推荐

