Python标准库是否存在支持不可哈希元素的唯一列表数据结构?
回答
Python标准库目前没有提供原生的、支持存储不可哈希元素的自动去重有序列表类,你可以根据你的场景选择继续使用自定义实现,或对现有实现做补充完善来避免非append操作导致的重复问题。
标准库现有结构的局限性
set:自带自动去重能力,但要求所有元素必须可哈希,无法满足你存储不可哈希元素(如字典、列表)的需求- 3.7+ 原生
dict、collections.OrderedDict:可保证插入顺序、key自动去重,但同样要求key为可哈希类型,不适用你的场景 - 其他内置容器均没有自带「插入时自动按身份判重、保留插入顺序、支持不可哈希元素」的特性
现有自定义类的优化方案
你当前的实现仅重写了append方法,确实存在通过其他方法修改列表导致重复的问题,你可以补充重写其他列表修改方法来规避这类问题,参考实现如下:
class UniqueList(list): # 封装统一的身份判重逻辑 def _is_duplicate(self, item): for existing_item in self: if item is existing_item: return True return False def append(self, new_item): if not self._is_duplicate(new_item): super().append(new_item) def extend(self, items): for item in items: self.append(item) def insert(self, index, new_item): if not self._is_duplicate(new_item): super().insert(index, new_item) def __setitem__(self, key, new_item): if not self._is_duplicate(new_item): super().__setitem__(key, new_item) def __iadd__(self, items): self.extend(items) return self
如果你的使用场景中只会用到append方法添加元素,也可以继续使用原来的简化版实现,在数据量不大的情况下O(n)的判重开销完全可以接受。
内容的提问来源于stack exchange,提问作者John
相关产品推荐
相关产品推荐

