Двухсторонняя / обратная карта - PullRequest
81 голосов
/ 21 сентября 2009

Я делаю это переключение в Python, где мне нужно отслеживать, кто с кем разговаривает, так что если Алиса -> Боб, то это подразумевает, что Боб -> Алиса.

Да, я мог бы заполнить две хеш-карты, но мне интересно, есть ли у кого-нибудь идея сделать это с одной.

Или предложить другую структуру данных.

Нет нескольких разговоров. Допустим, это для колл-центра обслуживания клиентов, поэтому, когда Алиса набирает номер на коммутаторе, она только собирается поговорить с Бобом. Его ответы также относятся только к ней.

Ответы [ 13 ]

1 голос
/ 03 января 2013

Вы можете использовать DoubleDict, как показано в рецепте 578224 в Python Cookbook .

0 голосов
/ 11 марта 2018

Вот еще одна двусторонняя реализация словаря, расширяющая класс питонов dict на случай, если вам не понравился ни один из этих других:

class DoubleD(dict):
    """ Access and delete dictionary elements by key or value. """ 

    def __getitem__(self, key):
        if key not in self:
            inv_dict = {v:k for k,v in self.items()}
            return inv_dict[key]
        return dict.__getitem__(self, key)

    def __delitem__(self, key):
        if key not in self:
            inv_dict = {v:k for k,v in self.items()}
            dict.__delitem__(self, inv_dict[key])
        else:
            dict.__delitem__(self, key)

Используйте его как обычный словарь Python, кроме как в конструкции:

dd = DoubleD()
dd['foo'] = 'bar'
0 голосов
/ 22 сентября 2009

Модуль расширения kjbuckets C предоставляет «графическую» структуру данных, которая, я считаю, дает вам то, что вы хотите.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...