2015-10-19 2 views
2

J'ai une classe Foo qui a une variable de chaîne d'instance id. J'ai implémenté les méthodes magiques __eq__ et __hash__ pour qu'elles n'utilisent que id, donc une instance Foo et sa chaîne id sont mappées sur le même compartiment de hachage. Cependant, disons qu'il y a un dict avec les touches Foo instances, et j'ai seulement la chaîne id. Je souhaite récupérer l'instance Foo dans laquelle se trouve le id.Récupérer la clé à partir de la clé dict

Une façon consiste à parcourir toutes les clés de la dict, mais y a-t-il quelque chose de plus efficace/simple?

Répondre

3

Il n'y a aucun moyen de récupérer l'objet Foo() correspondant utilisé directement une clé, non.

Vos options sont en boucle sur toutes les touches et correspondent à l'attribut id, ou peut-être recréent l'objet avec Foo(id); Si tout ce que vous devez faire est de l'utiliser comme une clé de recherche, alors cela devrait plus que suffisant.

Si ces objets ont plus d'attributs et id des cartes uniquement pour ces attributs, pensez à ajouter un autre dictionnaire que vous gérez les ID de mappage aux instances Foo().

+0

J'ai besoin de récupérer la même référence de l'instance 'Foo' stockée dans le dict, donc l'instanciation d'une nouvelle instance de' Foo' n'est pas une option. J'aime l'idée d'avoir un 'dict' séparé purement pour les mappings' id: Foo'. Il sacrifie l'efficacité de l'espace pour la vitesse. La plupart du temps, la portée du code aura seulement la connaissance de la chaîne 'id' et il doit modifier l'instance' Foo' correspondante, donc je pense que je devrais aller avec le dict séparé. – onepiece

+1

J'ai réalisé que mon code nécessitait un refactoring significatif. Les valeurs dans l'original 'dict' auraient dû être des variables d'instance dans' Foo', et la nouvelle dict est 'id: Foo'. Donc, ma question est discutable, mais toujours agréable de savoir que nous ne pouvons pas récupérer une clé en utilisant une clé pour les dictionnaires. – onepiece

2

créer simplement un objet factice Foo la donnée id et regarder que sur la carte.

2

En plus de la réponse de @Martijn Pieters:

Dans le cas où votre Foo est lourd, vous pouvez définir une classe Bar avec des fonctionnalités minimales (self.id, __eq__ et __hash__) et faites votre Foo en héritent.

Ensuite, vous pouvez utiliser léger Bar instance pour récupérer la valeur associée à Foo objet de votre dictionnaire.

+0

Pourquoi ne pas utiliser la chaîne 'id' pour récupérer la valeur? Ce serait encore plus léger que l'objet 'Bar'. Aussi, je veux utiliser une clé pour récupérer une clé, pas une valeur. Peut-être que ma situation indique des problèmes avec la décomposition de mon code. Voir mes commentaires à la réponse de Martjin. – onepiece

+0

déjà vu (après avoir posté cette réponse). Je ferais attention à créer une classe mutable à partir d'une chaîne, qui est par définition immuable en Python. –

+0

"créer une classe mutable à partir d'une chaîne" - que voulez-vous dire, et quels sont les dangers? – onepiece