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