3 回答

TA贡献1826条经验 获得超6个赞
您可以通过子类化dict并添加所需的逻辑来创建自己的字典类型。这是一个基本示例:
class TwoWayDict(dict):
def __setitem__(self, key, value):
# Remove any previous connections with these values
if key in self:
del self[key]
if value in self:
del self[value]
dict.__setitem__(self, key, value)
dict.__setitem__(self, value, key)
def __delitem__(self, key):
dict.__delitem__(self, self[key])
dict.__delitem__(self, key)
def __len__(self):
"""Returns the number of connections"""
return dict.__len__(self) // 2
它的工作原理如下:
>>> d = TwoWayDict()
>>> d['foo'] = 'bar'
>>> d['foo']
'bar'
>>> d['bar']
'foo'
>>> len(d)
1
>>> del d['foo']
>>> d['bar']
Traceback (most recent call last):
File "<stdin>", line 7, in <module>
KeyError: 'bar'
我确定我没有涵盖所有情况,但这应该可以帮助您入门。

TA贡献1785条经验 获得超4个赞
在特殊情况下,您可以将两者都存储在一个字典中:
relation = {}
relation['Alice'] = 'Bob'
relation['Bob'] = 'Alice'
由于您要描述的是对称关系。 A -> B => B -> A

TA贡献1942条经验 获得超3个赞
我知道这是一个比较老的问题,但是我想提一个解决这个问题的另一个好方法,就是python软件包bidict。使用起来非常简单:
from bidict import bidict
map = bidict(Bob = "Alice")
print(map["Bob"])
print(map.inv["Alice"])
添加回答
举报