Python 3.x 如何在Python3中获得集合的匹配元素?

Python 3.x 如何在Python3中获得集合的匹配元素?,python-3.x,Python 3.x,我正在编写一个Python程序,其中涉及一个由不可变对象表示的多个状态的图。生成图形的过程会生成每个状态的多个副本。有大量的状态,所以为了节省内存,我希望在最终的图形对象中只保留每个状态的一个副本。因此,我想构建一组规范状态,并编写如下函数: def canonicalize(state, canonical_states): if state in canonical_states: state, = (cstate for cstate in canonical_st

我正在编写一个Python程序,其中涉及一个由不可变对象表示的多个状态的图。生成图形的过程会生成每个状态的多个副本。有大量的状态,所以为了节省内存,我希望在最终的图形对象中只保留每个状态的一个副本。因此,我想构建一组规范状态,并编写如下函数:

def canonicalize(state, canonical_states):
    if state in canonical_states:
        state, = (cstate for cstate in canonical_states if cstate == state)
    else:
        canonical_states.add(state)
    return state
def canonicalize(state, canonical_states):
    return canonical_states.setdefault(state, state)
此函数接受一个状态并返回该状态的“规范”版本。如果之前未看到该状态,则它将成为规范版本

应该可以在大致恒定的时间内查找set元素,但此实现需要O(n)个查找时间。有更好的办法吗

一种解决方案是将
规范状态
表示为将元素映射到自身的dict(见下面的答案)。我更喜欢在不改变规范状态类型的情况下实现这种性能的解决方案


简而言之:对于某些集合
S
,如果
x在S
中,有没有一种方法可以得到
S
的元素
y
,从而
x==y

通过将每个状态映射到自身的dict来表示规范状态集。然后代码变成如下所示:

def canonicalize(state, canonical_states):
    if state in canonical_states:
        state, = (cstate for cstate in canonical_states if cstate == state)
    else:
        canonical_states.add(state)
    return state
def canonicalize(state, canonical_states):
    return canonical_states.setdefault(state, state)