Quelque chose comme ça, peut-être:
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))
Vous devez décider ce que vous voulez arriver si plus d'une clé a une valeur donnée; la bidirectionnalité d'une paire donnée pourrait facilement être bousculée par une paire ultérieure que vous avez insérée. J'ai mis en place un choix possible.
Exemple:
bd = BidirDict({'a': 'myvalue1', 'b': 'myvalue2', 'c': 'myvalue2'})
print bd['myvalue1'] # a
print bd['myvalue2'] # b
Si vous préférez, on peut supposer que les valeurs sont immuables, ainsi que les clés sont. –
Que voulez-vous retourner pour ce dict: {'a': 1, 'b': 2, 'A': 1} – PaulMcG
@PaulMcGuire: Je voudrais retourner '{1: ['a', 'A'], 2 : 'b'} '. Voir ma réponse pour une telle façon de le faire. – Basj