如何在Python 3中获取集合的匹配元素?

时间:2014-10-12 07:23:57

标签: python-3.x

我正在编写一个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

此函数采用状态并返回"规范"该州的版本。如果以前没有看过该州,它就会成为规范版本。

应该可以在大致恒定的时间内查找一个set元素,但是这个实现每次查找需要O(n)时间。还有更好的方法吗?

一种解决方案是将canonical_states表示为自己的dict映射元素(请参阅下面的答案)。我更喜欢在不改变canonical_states的类型的情况下实现此性能的解决方案。

简而言之:鉴于某些集合x in S的{​​{1}},是否有办法获取S这样的y元素那S

1 个答案:

答案 0 :(得分:0)

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

def canonicalize(state, canonical_states):
    return canonical_states.setdefault(state, state)