Я делаю этот коммутатор на Python, где мне нужно отслеживать, кто с кем разговаривает, поэтому, если Алиса -> Боб, то это означает, что Боб -> Алиса.
Да, я мог бы заполнить две хеш-карты, но мне интересно, есть ли у кого-нибудь идея сделать это с одной.
Или предложите другую структуру данных.
Нет нескольких разговоров. Допустим, это для центра обслуживания клиентов, поэтому, когда Алиса набирает номер на коммутаторе, она будет говорить только с Бобом. Его ответы тоже идут только ей.
Ответы:
Вы можете создать свой собственный тип словаря, создав подклассы
dict
и добавив нужную логику. Вот простой пример:А работает это так:
Я уверен, что не рассмотрел все случаи, но это должно помочь вам начать.
источник
.add
метод, чтобы вы могли делать что-то подобное,d.add('Bob', 'Alice')
вместо того, чтобы использовать синтаксис, который я показал. Я бы также включил некоторую обработку ошибок. Но вы поняли основную идею. :)d['foo'] = 'baz'
потребуется дополнительно удалитьbar
ключ).dict
приводит к некоторому обманчивому поведению, потому что если вы создадите объект с некоторым начальным содержимым, структура будет нарушена.__init__
необходимо переопределить, чтобы конструкция вродеd = TwoWayDict({'foo' : 'bar'})
работала правильно.pip install bidict
. URL: pypi.python.org/pypi/bidictВ вашем особом случае вы можете хранить оба в одном словаре:
Поскольку то, что вы описываете, является симметричным отношением.
A -> B => B -> A
источник
Я знаю, что это более старый вопрос, но я хотел бы упомянуть еще одно отличное решение этой проблемы, а именно двунаправленный пакет python . Очень просто использовать:
источник
Я бы просто заполнил второй хеш с помощью
источник
reverse_map = dict(reversed(item) for item in forward_map.items())
my_dict.update(dict(reversed(item) for item in my_dict.items()))
Unexpected type(s): (Generator[Iterator[Union[str, Any]], Any, None]) Possible types: (Mapping) (Iterable[Tuple[Any, Any]])
. Есть идеи, как избавиться от предупреждения?Две хэш-карты - это, вероятно, самое быстрое решение, если вы можете сэкономить память. Я бы обернул их в один класс - задача программиста состоит в том, чтобы обеспечить правильную синхронизацию двух хэш-карт.
источник
mydict[:value]
для полученияkey
(за счет некоторой производительности)У вас есть две разные проблемы.
У вас есть объект «Разговор». Это относится к двум лицам. Поскольку человек может вести несколько разговоров, у вас есть отношения «многие ко многим».
У вас есть карта от человека к списку разговоров. Конверсия будет иметь пару Лиц.
Сделай что-нибудь вроде этого
источник
Нет, без создания двух словарей это сделать невозможно. Как можно было бы реализовать это с помощью всего одного словаря, сохраняя при этом сопоставимую производительность?
Лучше создать собственный тип, который инкапсулирует два словаря и предоставляет желаемую функциональность.
источник
Менее подробный способ с использованием обратного:
источник
Вы можете использовать a,
DoubleDict
как показано в рецепте 578224 в Python Cookbook .источник
Другое возможное решение - реализовать подкласс
dict
, который содержит исходный словарь и отслеживает его обратную версию. Хранение двух отдельных диктовок может быть полезно, если ключи и значения перекрываются.Пример:
источник
На pypi есть расширенная библиотека коллекций: https://pypi.python.org/pypi/collections-extended/0.6.0
Использовать класс bijection так же просто, как:
источник
Мне нравится предложение бидикта в одном из комментариев.
pip install bidict
Использование:
Поскольку об этом не так много документов. Но у меня есть все необходимые мне функции, которые работают правильно.
Печать:
источник
Модуль расширения kjbuckets C предоставляет «графическую» структуру данных, которая, как мне кажется, дает вам то, что вы хотите.
источник
Вот еще одна реализация двустороннего словаря путем расширения
dict
класса pythons на случай, если вам не понравился какой-либо из них:Используйте его как обычный словарь Python, за исключением конструкции:
источник
Мне нравится делать такие вещи примерно так:
источник