2014-10-12 88 views
0

我正在写一个Python程序,涉及由不可变对象表示的许多状态的图。生成图的过程会生成每个状态的许多重复副本。有很多状态,所以为了节省内存,我想在最终的图形对象中只保留每个状态的一个副本。因此,我想建立一套规范的状态,并写一个函数是这样的:如何在Python 3中获取集合的匹配元素?

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 

此功能需要一个状态,并返回该国的“经典”版本。如果这个国家以前没有见过,它就成了规范版本。

应该可以在大致恒定的时间内查找设置元素,但是这种实现需要每次查找需要O(n)个时间。有没有更好的办法?

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

一言以蔽之:鉴于x in S对于一些设置S,有没有办法让元素S这样x == yy

回答

0

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

def canonicalize(state, canonical_states): 
    return canonical_states.setdefault(state, state) 
相关问题