如果您可以接受把“相等”定义为“同一”,那么您可以创建一个可哈希的列表子类型,并将其作为集合成员进行快速访问/删除:
class hlist(list):
"Hashable list"
def __hash__(self):
return id(self)
def __eq__(self, other):
return self is other
def __ne__{self, other}:
return self is not other
in1 = hlist([1,2,3])
in2 = hlist([4,5,6])
outer = set([in1, in2])
在这种情况下,字典是你想要的集合,因为它具有O(1)的查找和删除。虽然你需要为每个对象生成一个键来添加/删除,但它比扫描列表的O(n)方法要快得多。在这种情况下,为你的对象生成一个键是正确的做法。如果你有一个主键(它们来自数据库吗?),那么将抵消哈希函数以进行属性查找,并且你将实现接近完美的性能。
你似乎认为在这种情况下使用字典作为数据结构是不好的 - 实际上并不是这样。字典的目的是快速查找集合中的项。这正是你所需要的,使用它吧。
这也许不完全是你所要求的,但是 collections.deque
可能满足你的一些需求:
deque 支持线程安全、内存高效地从 deque 的任意一侧进行附加和弹出操作,并且在任何方向上具有大约相同的 O(1) 性能。
列表
,然后再创建另一个包含所需跟踪的集合在列表中索引的集合呢?虽然这可能需要一些额外的工作,但你应该可以将其抽象成一个类。
collection.remove(item)
时,这个 item 可能会出现在多个子集合中或者在单个集合中出现多次吗?无论如何,我怀疑操作的瓶颈将是搜索 item 的位置,以确定它属于哪些子集合以及与之关联的索引或键,以便继续进行删除。 - martineau