On m'a demandé d'écrire un code comprenant une fonction- Reverse_dict_in_place (d)
qui passe entre les clés et les valeurs du dictionnaire entré. Sans changer l'emplacement du dictionnaire en mémoire (en place). P>
Cependant, le test de la fonction avec ID () montre que toutes mes solutions changent Emplacement de la mémoire de dictionnaires. P>
def reverse_dict_in_place(d):
d={y:x for x,y in d.items()}
return d
4 Réponses :
alternative aux celles actuelles qui permettent aux valeurs d'être identiques aux clés. Fonctionne principalement de la même manière cependant, cependant, aucune fois que deux valeurs ne peuvent être identiques.
def reverse_dict_in_place(d):
copy = d.copy().items()
d.clear()
for k, v in copy:
d[v] = k
return d
>>> x = {0: 1, 1: 2}
>>> y = reverse_dict_in_place(x)
>>> id(x) == id(y)
True
>>>
Certaines hypothèses pour que cela fonctionne (grâce à tous les utilisateurs qui les indiquaient):
Si vous êtes à l'aise avec ces hypothèses, je pense que cela devrait fonctionner: P>
def reverse_dict_in_place(d):
for k,v in d.items():
del d[k]
d[v] = k
return d
Pouvez-vous démontrer que cela a un comportement différent concernant "ID ()" que le code en op?
Cela ne fonctionne malheureusement pas, comme le dictionnaire change de taille pendant l'itération. J'ai posté quelque chose de similaire, mais la valeur de la clé peut modifier une clé déjà dans le dictionnaire. Par conséquent, non seulement il n'ya pas seulement de valeurs en double, mais pas de duplicate dans l'ensemble des valeurs et des clés
@Kennyostrom Exécuter ID (d) == ID (Reverse_dict_in_place (d)) code> retournera vrai code> pour mon implémentation et false code> pour le code de l'OP.
@Nightshade Je conviens que cela ne fonctionnerait pas si l'une des valeurs du dictionnaire est également une clé.
Je conseillerais totalement contre la mutation pendant l'itération.
@Pedrorodrigues complètement d'accord! Comme cette question semble être plus une question de défi / type d'entretien, j'ai supposé que cela peut être résolu par tout moyen (potentiellement dangereux) nécessaire. Cela ne devrait jamais être utilisé dans le code réel!
@Glad Dans ce cas, vous pouvez en réalité sortir avec elle, au moins depuis Python 3 quelque chose, les dict sont commandés par ordre d'insertion. Il suffit d'élaborer une nouvelle réponse, si vous voulez, je peux éditer la vôtre et la mine de fossé.
semble fonctionner! Est-il possible de l'exécuter sans changer de séquence de clés?
@Markschaff Depuis Python 3.7 Les clés sont commandées par insertion, alors que nous en déroulons sur eux et définir la valeur comme clé - la commande doit être préservée. Dans les versions antérieures des touches Python n'ayant pas vraiment de commande (sauf si commanddddict code> est utilisé), il n'y a donc aucune garantie sur la commande que vous obtiendrez également lors de l'itération.
Remarque: @nightshade a posté une réponse similaire que ma réponse ci-dessous, plus tôt que j'ai posté.
Vous pouvez essayer ceci: p>
my_dict = {1:1, 2:'two', 3:'three'}
reverse_dict_in_place(my_dict)
print (my_dict)
s'étendant sur GAD suggestion, vous pouvez utiliser la compréhension dict: où Cela ne fonctionnerait pas, sans modification, pour des dicts imbriqués. P> P> d code> est une dict et les mêmes hypothèses s'appliquent: P>
C'est la même chose que ce qui est fourni dans la question et pointe vers un nouveau dictionnaire, d'où un autre id code> aussi
C'est vrai. J'ai peur que Python gère la mémoire pour vous, ce n'est pas un choix. Je suppose que vous auriez besoin de mettre en œuvre cela dans C.
Mais votre code ne tente même pas de faire ce qui est demandé; Vous créez simplement un nouveau dictionnaire et vous le renvoyez. Pourquoi penseriez-vous que cela fonctionnerait?
Il est impossible d'inverser un dictionnaire, puisque vous ne pouvez pas être sûr qu'il n'y a pas de valeurs en double.
Il y a une grande différence entre "peut jeter une exception" et "impossible". Je pense que cela a besoin exemple de reproductible minimal . Afficher quelques lignes de code qui démontrent l'ID (). Ceci est important d'établir ce que vous voulez.
Il est tout à fait possible d'inverser le dictionnaire en place, mais qu'avez-vous essayé de maintenir l'emplacement de la mémoire? Cela ressemble à une question de devoirs où vous venez de jeter vos mains et de dire «j'abandonne» sans vraiment i> essayer. Il y a beaucoup de méthodes sur place telles que des affectations d'élément ou
dict.clear () code> oudict.update () code>, et il est facile d'obtenir une copie avecdict.copy () code>. Espérons que cela vous mènera sur le bon chemin, rappelez-vous simplement de gérer les valeurs dupliquées.