Нет такого намерения, которое могло бы напрямую создать новую рутину.
Путем мне нравится делать, такого рода вещь - что-то как:
{my_dict[key]: key for key in my_dict.keys()}
Менее подробный путь, все еще с помощью инвертированный:
dict(map(reversed, my_dict.items()))
В вашем особом случае вы можете хранить оба в одном словаре:
relation = {}
relation['Alice'] = 'Bob'
relation['Bob'] = 'Alice'
Поскольку то, что вы описываете, является симметричным отношением. A -> B => B -> A
Я бы просто подставил второй хэш с помощью
reverse_map = dict((reversed(item) for item in forward_map.items()))
Две хеш-карты, вероятно, являются самым быстродействующим решением, если предположить, что вы можете сэкономить память. Я бы обернул их в один класс - задача программиста состоит в том, чтобы обеспечить правильную синхронизацию двух хэш-карт.
У вас есть две отдельные проблемы.
У вас есть объект «Разговор». Это относится к двум лицам. Поскольку у человека может быть несколько диалогов, у вас есть отношение «многие ко многим».
У вас есть карта от человека к списку разговоров. Преобразование будет иметь пару лиц.
Сделайте что-нибудь вроде этого
from collections import defaultdict
switchboard= defaultdict( list )
x = Conversation( "Alice", "Bob" )
y = Conversation( "Alice", "Charlie" )
for c in ( x, y ):
switchboard[c.p1].append( c )
switchboard[c.p2].append( c )
Нет, на самом деле нет способа сделать это, не создав два словаря. Как можно было бы реализовать это с помощью всего одного словаря, продолжая обеспечивать сопоставимую производительность?
Лучше создать собственный тип, который инкапсулирует два словаря и предоставляет желаемую функциональность.
Модуль расширения kjbuckets C предоставляет структуру данных «граф», которую я вера дает вам то, что вы хотите.