Est-il possible d'attribuer plusieurs clés par valeur dans un dictionnaire Python. Une solution possible est d'assigner une valeur à chaque clé:
dict = {'k1':'v1', 'k2':'v1', 'k3':'v1', 'k4':'v2'}
mais cela n'est pas efficace en termes de mémoire car mon fichier de données fait > 2 Go. Autrement, vous pourriez créer un dictionnaire de clés de dictionnaire:
key_dic = {'k1':'k1', 'k2':'k1', 'k3':'k1', 'k4':'k4'}
dict = {'k1':'v1', 'k4':'v2'}
main_key = key_dict['k2']
valeur = dict[main_key]
Cela demande également beaucoup de temps et d'efforts car je dois parcourir tout le dictionnaire/fichier deux fois. Existe-t-il une autre solution facile et intégrée en Python?
Note: mes valeurs de dictionnaire ne sont pas des chaînes simples (comme dans la question 'v1', 'v2') mais plutôt des objets complexes (contenant différents autres dictionnaires/listes, etc. et il n'est pas possible de les pickler)
Note: la question semble similaire à Comment puis-je utiliser à la fois une clé et un index pour la même valeur de dictionnaire? Mais je ne cherche pas un dictionnaire ordonné/indexé et je recherche d'autres solutions efficaces (si elles existent) autres que les deux mentionnées dans cette question.
3 votes
Vous êtes peu susceptible de trouver une solution meilleure que votre première. Il suffit de mettre plusieurs clés dans le dictionnaire. Pourquoi cela ne suffit-il pas?
0 votes
Comme je l'ai dit dans la question, le fichier est très volumineux, donc mettre les mêmes valeurs plusieurs fois nécessite beaucoup de mémoire.
10 votes
Les valeurs en python ne sont pas nécessairement dupliquées en python, même en utilisant plusieurs clés pour y faire référence.
0 votes
La valeur n'utilisera pas de mémoire supplémentaire à moins que vous ne la recréiez à chaque fois. Voir la réponse de @Useless.
0 votes
@MartijnPieters - oh j'ai manqué ce point, je pense que je devrais faire plus de tests maintenant je me souviens i,j=0, 0; id(i)==id(j); True :)
0 votes
C'est là que les pointeurs seraient utiles ... explicite est mieux que implicite
0 votes
@moooeeeep Ciel, non. Cela reflète une incompréhension fondamentale du modèle d'objet Python. Vous vous attendez à ce que les choses fonctionnent de cette manière parce qu'elles fonctionnent toujours de cette manière. Python reflète "l'explicite est meilleur que l'implicite" - en vous attendant à être explicite lorsque vous voulez les autres sémantiques (c'est-à-dire la sémantique de valeur). Vous le faites par exemple en utilisant le module
copy
, ou en écrivant autrement du code qui force la création d'un nouvel objet avec la même valeur.0 votes
@KarlKnechtel Je suis habitué à avoir un degré de précision plus élevé imposé par le langage lui-même. Je veux dire, Python utilise implicitement le modèle de référence d'objet de type pointeur.
0 votes
@moooeeeep c'est absurde. Vous devez choisir un modèle d'objet. C++ utilise tout aussi "implicitement" le modèle d'objet de valeur.
0 votes
@KarlKnechtel il vous oblige à spécifier la valeur exacte / le pointeur / la référence à chaque fois que vous voulez utiliser un objet. Ça ne pourrait pas être plus explicite, je pense.
0 votes
@moooeeeep c'est un problème complètement différent. La saisie de manifeste n'a absolument rien à voir avec les sémantiques de valeur contre référence, et de toute façon n'est pas "explicite" dans un sens que les Pythonistas considèrent comme significatif.