Ich mache diese Telefonzentrale in Python, wo ich nachverfolgen muss, wer mit wem spricht. Wenn also Alice -> Bob, dann bedeutet das, dass Bob -> Alice.
Ja, ich könnte zwei Hash-Karten füllen, aber ich frage mich, ob jemand eine Idee hat, dies mit einer zu tun.
Oder schlagen Sie eine andere Datenstruktur vor.
Es gibt keine Mehrfachgespräche. Nehmen wir an, dies ist für ein Kundendienst-Callcenter. Wenn Alice sich in die Telefonzentrale einwählt, wird sie nur mit Bob sprechen. Seine Antworten gehen auch nur an sie.
Antworten:
Sie können Ihren eigenen Wörterbuchtyp erstellen,
dict
indem Sie die gewünschte Logik unterordnen und hinzufügen. Hier ist ein einfaches Beispiel:Und es funktioniert so:
Ich bin sicher, ich habe nicht alle Fälle abgedeckt, aber das sollte Ihnen den Einstieg erleichtern.
quelle
.add
Methode hinzu, mit der Sie beispielsweise die von mir gezeigted.add('Bob', 'Alice')
Syntax verwenden können. Ich würde auch eine Fehlerbehandlung einschließen. Aber Sie bekommen die Grundidee. :)d['foo'] = 'baz'
derbar
Schlüssel müsste zusätzlich entfernt werden ).dict
führen hier zu irreführendem Verhalten, denn wenn Sie das Objekt mit anfänglichem Inhalt erstellen, wird die Struktur beschädigt.__init__
muss überschrieben werden, damit eine Konstruktiond = TwoWayDict({'foo' : 'bar'})
ordnungsgemäß funktioniert.pip install bidict
. URL: pypi.python.org/pypi/bidictIn Ihrem speziellen Fall können Sie beide in einem Wörterbuch speichern:
Denn was Sie beschreiben, ist eine symmetrische Beziehung.
A -> B => B -> A
quelle
Ich weiß, dass es eine ältere Frage ist, aber ich wollte eine andere großartige Lösung für dieses Problem erwähnen, nämlich das Bidict des Python-Pakets . Es ist sehr einfach zu bedienen:
quelle
Ich würde nur einen zweiten Hash mit füllen
quelle
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]])
. Irgendwelche Ideen, wie man die Warnung loswird?Zwei Hash-Maps sind wahrscheinlich die Lösung mit der schnellsten Leistung, vorausgesetzt, Sie können Speicherplatz sparen. Ich würde diese in eine einzige Klasse einschließen - die Belastung für den Programmierer besteht darin, sicherzustellen, dass zwei der Hash-Maps korrekt synchronisiert werden.
quelle
mydict[:value]
, umkey
(auf Kosten einer gewissen Leistung) zu erhaltenSie haben zwei separate Probleme.
Sie haben ein "Conversation" -Objekt. Es bezieht sich auf zwei Personen. Da eine Person mehrere Gespräche führen kann, haben Sie eine Viele-zu-Viele-Beziehung.
Sie haben eine Karte von Person zu einer Liste von Gesprächen. Eine Konvertierung hat zwei Personen.
Mach so etwas
quelle
Nein, es gibt wirklich keine Möglichkeit, dies zu tun, ohne zwei Wörterbücher zu erstellen. Wie wäre es möglich, dies mit nur einem Wörterbuch zu implementieren und gleichzeitig eine vergleichbare Leistung zu bieten?
Sie sollten einen benutzerdefinierten Typ erstellen, der zwei Wörterbücher enthält und die gewünschte Funktionalität bereitstellt.
quelle
Ein weniger ausführlicher Weg, immer noch umgekehrt:
quelle
Möglicherweise können Sie ein
DoubleDict
wie in Rezept 578224 im Python-Kochbuch gezeigt verwenden .quelle
Eine andere mögliche Lösung besteht darin, eine Unterklasse von zu implementieren
dict
, die das ursprüngliche Wörterbuch enthält und eine umgekehrte Version davon verfolgt. Das Halten von zwei getrennten Diktaten kann nützlich sein, wenn sich Schlüssel und Werte überschneiden.Beispiel:
quelle
Auf pypi befindet sich die Bibliothek mit erweiterten Sammlungen: https://pypi.python.org/pypi/collections-extended/0.6.0
Die Verwendung der Bijektionsklasse ist so einfach wie:
quelle
Ich mag den Vorschlag von Bidict in einem der Kommentare.
pip install bidict
Verwendung:
Da gibt es nicht viele Dokumente darüber. Aber ich habe alle Funktionen, die ich brauche, damit es richtig funktioniert.
Drucke:
quelle
Das kjbuckets C-Erweiterungsmodul bietet eine "Graph" -Datenstruktur, von der ich glaube, dass sie Ihnen das bietet, was Sie wollen.
quelle
Hier ist eine weitere Zwei-Wege-Wörterbuchimplementierung durch Erweitern der Python-
dict
Klasse, falls Ihnen eine dieser anderen nicht gefallen hat:Verwenden Sie es als normales Python-Wörterbuch, außer in der Konstruktion:
quelle
Eine Art und Weise, wie ich so etwas mache, ist so etwas wie:
quelle