Двумя путями/реверсами карта

Нет такого намерения, которое могло бы напрямую создать новую рутину.

87
задан Peter O. 7 December 2012 в 07:35
поделиться

8 ответов

Путем мне нравится делать, такого рода вещь - что-то как:

{my_dict[key]: key for key in my_dict.keys()}
0
ответ дан 24 November 2019 в 07:46
поделиться

Менее подробный путь, все еще с помощью инвертированный:

dict(map(reversed, my_dict.items()))
0
ответ дан 24 November 2019 в 07:46
поделиться

В вашем особом случае вы можете хранить оба в одном словаре:

relation = {}
relation['Alice'] = 'Bob'
relation['Bob'] = 'Alice'

Поскольку то, что вы описываете, является симметричным отношением. A -> B => B -> A

43
ответ дан 24 November 2019 в 07:46
поделиться

Я бы просто подставил второй хэш с помощью

reverse_map = dict((reversed(item) for item in forward_map.items()))
21
ответ дан 24 November 2019 в 07:46
поделиться

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

8
ответ дан 24 November 2019 в 07:46
поделиться

У вас есть две отдельные проблемы.

  1. У вас есть объект «Разговор». Это относится к двум лицам. Поскольку у человека может быть несколько диалогов, у вас есть отношение «многие ко многим».

  2. У вас есть карта от человека к списку разговоров. Преобразование будет иметь пару лиц.

Сделайте что-нибудь вроде этого

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 )
5
ответ дан 24 November 2019 в 07:46
поделиться

Нет, на самом деле нет способа сделать это, не создав два словаря. Как можно было бы реализовать это с помощью всего одного словаря, продолжая обеспечивать сопоставимую производительность?

Лучше создать собственный тип, который инкапсулирует два словаря и предоставляет желаемую функциональность.

4
ответ дан 24 November 2019 в 07:46
поделиться

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

0
ответ дан 24 November 2019 в 07:46
поделиться
Другие вопросы по тегам:

Похожие вопросы: