Một cái gì đó như thế này, có thể:
import itertools
class BidirDict(dict):
def __init__(self, iterable=(), **kwargs):
self.update(iterable, **kwargs)
def update(self, iterable=(), **kwargs):
if hasattr(iterable, 'iteritems'):
iterable = iterable.iteritems()
for (key, value) in itertools.chain(iterable, kwargs.iteritems()):
self[key] = value
def __setitem__(self, key, value):
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):
value = self[key]
dict.__delitem__(self, key)
dict.__delitem__(self, value)
def __repr__(self):
return '%s(%s)' % (type(self).__name__, dict.__repr__(self))
Bạn phải quyết định điều gì bạn muốn xảy ra nếu nhiều hơn một khóa có giá trị nhất định; tính hai chiều của một cặp nhất định có thể dễ dàng bị che lấp bởi một số cặp sau đó bạn đã chèn. Tôi đã thực hiện một lựa chọn khả thi.
Thí dụ :
bd = BidirDict({'a': 'myvalue1', 'b': 'myvalue2', 'c': 'myvalue2'})
print bd['myvalue1']
print bd['myvalue2']