Je fais ce truc de standard en python où je dois garder une trace de qui parle à qui, donc si Alice -> Bob, alors cela implique que Bob -> Alice.
Oui, je pourrais remplir deux cartes de hachage, mais je me demande si quelqu'un a une idée pour le faire avec une seule.
Ou suggérez une autre structure de données.
Il n'y a pas de conversations multiples. Disons que c'est pour un centre d'appels du service client, alors quand Alice se connecte au standard, elle ne parlera qu'à Bob. Ses réponses ne vont également qu'à elle.
Réponses:
Vous pouvez créer votre propre type de dictionnaire en sous
dict
- classant et en ajoutant la logique souhaitée. Voici un exemple de base:Et ça marche comme ça:
Je suis sûr que je n'ai pas couvert tous les cas, mais cela devrait vous aider à démarrer.
la source
.add
méthode pour que vous puissiez faire des choses commed.add('Bob', 'Alice')
au lieu d'utiliser la syntaxe que j'ai montrée. J'inclurais également une gestion des erreurs. Mais vous avez l'idée de base. :)d['foo'] = 'baz'
il faudrait en outre supprimer labar
clé).dict
produit ici un comportement trompeur, car si vous créez l'objet avec un contenu initial, la structure sera rompue.__init__
doit être annulée pour permettre à une construction commed = TwoWayDict({'foo' : 'bar'})
de fonctionner correctement.pip install bidict
. URL: pypi.python.org/pypi/bidictDans votre cas particulier, vous pouvez stocker les deux dans un dictionnaire:
Puisque ce que vous décrivez est une relation symétrique.
A -> B => B -> A
la source
Je sais que c'est une question plus ancienne, mais je voulais mentionner une autre excellente solution à ce problème, à savoir le package python bidict . C'est extrêmement simple à utiliser:
la source
Je remplirais juste un deuxième hachage, avec
la source
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]])
. Des idées pour se débarrasser de l'avertissement?Deux cartes de hachage sont probablement la solution la plus performante en supposant que vous puissiez économiser la mémoire. Je les regrouperais dans une seule classe - le fardeau du programmeur est de s'assurer que deux cartes de hachage se synchronisent correctement.
la source
mydict[:value]
pour obtenirkey
(au prix de certaines performances)Vous avez deux problèmes distincts.
Vous avez un objet "Conversation". Il fait référence à deux personnes. Puisqu'une personne peut avoir plusieurs conversations, vous avez une relation plusieurs-à-plusieurs.
Vous avez une carte de personne à une liste de conversations. Une conversion aura une paire de personnes.
Faites quelque chose comme ça
la source
Non, il n'y a vraiment aucun moyen de faire cela sans créer deux dictionnaires. Comment serait-il possible de l'implémenter avec un seul dictionnaire tout en continuant à offrir des performances comparables?
Il vaut mieux créer un type personnalisé qui encapsule deux dictionnaires et expose la fonctionnalité souhaitée.
la source
Une manière moins verbeuse, toujours en utilisant inversé:
la source
Vous pourrez peut-être utiliser un
DoubleDict
comme indiqué dans la recette 578224 sur le livre de recettes Python .la source
Une autre solution possible consiste à implémenter une sous-classe de
dict
, qui contient le dictionnaire d'origine et garde une trace d'une version inversée de celui-ci. Garder deux dictionnaires séparés peut être utile si les clés et les valeurs se chevauchent.Exemple:
la source
Il y a la bibliothèque étendue des collections sur pypi: https://pypi.python.org/pypi/collections-extended/0.6.0
Utiliser la classe de bijection est aussi simple que:
la source
J'aime la suggestion de bidict dans l'un des commentaires.
pip install bidict
Utilisation:
Puisqu'il n'y a pas beaucoup de documentation à ce sujet. Mais toutes les fonctionnalités dont j'ai besoin fonctionnent correctement.
Impressions:
la source
Le module d'extension kjbuckets C fournit une structure de données "graphique" qui, je crois, vous donne ce que vous voulez.
la source
Voici une autre implémentation de dictionnaire bidirectionnel en étendant la
dict
classe pythons au cas où vous n'aimeriez aucune de ces autres:Utilisez-le comme un dictionnaire python normal sauf en construction:
la source
Une façon dont j'aime faire ce genre de chose est quelque chose comme:
la source