<p>正向和反向映射可能是您的最佳选择。下面是一种通过单个对象(添加了反向字典的dictionary子类)访问它们的方法</p>
<p>显然,它仍然需要分配内存,尽管这两个字典将使用对其中包含的相同对象的引用,而不是重复的对象</p>
<pre><code>class Map(dict):
def __init__(self, *args, **kwargs):
super().__init__(*args, **kwargs)
self._reversed = dict((v, k) for k, v in self.items())
if len(self) != len(self._reversed):
raise ValueError("values not unique")
def __setitem__(self, k, v):
if v in self._reversed:
raise ValueError("attempted item assignment would create many-to-one mapping")
if k in self:
# reassigning - need to delete reversed key first
del self._reversed[self[k]] # or just "del self[k]" here
super().__setitem__(k, v)
self._reversed[v] = k
def __delitem__(self, k):
del self._reversed[self[k]]
super().__delitem__(k)
def get_reversed(self, v):
return self._reversed[v]
if __name__ == '__main__':
a = Map({'strA1':'strB1', 'strA2':'strB2', 'strA3':'strB3'})
a["strA4"] = "strB4"
a["strA5"] = "strB5"
# in each of forward and reversed direction, test
# one of the pairs that we started with, and one of
# the pairs that we added afterwards
for k in "strA2", "strA4":
print(a[k])
for k in "strB3", "strB5":
print(a.get_reversed(k))
</code></pre>
<p>给出:</p>
<pre><code>strB2
strB4
strA3
strA5
</code></pre>
<p>它需要</p>