Existe-t-il un moyen de renommer une clé de dictionnaire sans réaffecter sa valeur à un nouveau nom et supprimer l'ancienne clé de nom; et sans itérer via la clé / valeur dict?
En cas de OrderedDict, faites de même, tout en conservant la position de cette clé.
python
dictionary
associative-array
ordereddictionary
rabin utam
la source
la source
OrderedDict
. les dits ignorent l'ordre lorsqu'ils sont comparés pour l'égalité, alors qu'ilsOrderedDict
tiennent compte de l'ordre lorsqu'ils sont comparés. Je sais que vous avez lié à quelque chose qui l'explique, mais j'ai pensé que votre commentaire pourrait avoir induit en erreur ceux qui n'avaient peut-être pas lu ce lien.OrderedDict
ordre prend en compte lors de la comparaison" Ok mais personne ne s'en soucie après la 3.7. Je prétends qu'ilOrderedDict
est en grande partie obsolète, pouvez-vous expliquer pourquoi il ne l'est pas? par exemple ici n'est pas convaincant à moins que vous ayez besoinreversed()
Réponses:
Pour un dict régulier, vous pouvez utiliser:
Pour un OrderedDict, je pense que vous devez en construire un entièrement nouveau en utilisant une compréhension.
Modifier la clé elle-même, comme cette question semble se poser, n'est pas pratique car les clés dict sont généralement des objets immuables tels que des nombres, des chaînes ou des tuples. Au lieu d'essayer de modifier la clé, réaffecter la valeur à une nouvelle clé et supprimer l'ancienne clé est de savoir comment vous pouvez obtenir le "renommer" en python.
la source
dict.pop
c'est réalisable pour un OrderedDict basé sur mon test.OrderedDict
préservera l'ordre d'insertion, ce qui n'est pas ce sur quoi porte la question.meilleure méthode en 1 ligne:
la source
d = {('test', 'foo'):[0,1,2]}
?d[('new', 'key')] = d.pop(('test', 'foo'))
En utilisant un chèque pour
newkey!=oldkey
, vous pouvez ainsi:la source
dict
ordre, même si python3.6 + l'initialise sous forme ordonnée, les versions précédentes ne le font pas et ce n'est pas vraiment une fonctionnalité juste un effet secondaire de la façon dont les dits py3.6 + ont été modifiés. UtilisezOrderedDict
si vous vous souciez de la commande.En cas de renommage de toutes les clés du dictionnaire:
la source
target_dict.keys()
garantie est-elle du même ordre que dans la définition? Je pensais qu'un dict Python n'est pas ordonné, et l'ordre de la vue des clés d'un dict est imprévisibleVous pouvez utiliser ceci
OrderedDict recipe
écrit par Raymond Hettinger et le modifier pour ajouter unerename
méthode, mais cela va être un O (N) en complexité:Exemple:
production:
la source
OrderedDict
le. Mais je recommanderais: Créez une classe qui hérite deOrderedDict
et ajoutez-y unerename
méthode.Quelques personnes avant moi ont mentionné l'
.pop
astuce pour supprimer et créer une clé dans une ligne.Personnellement, je trouve la mise en œuvre plus explicite plus lisible:
Le code ci-dessus renvoie
{'a': 1, 'c': 2}
la source
Les autres réponses sont plutôt bonnes, mais en python3.6, le dict régulier a également de l'ordre. Il est donc difficile de conserver la position de la clé dans un cas normal.
la source
En Python 3.6 (à partir de maintenant?), Je choisirais le one-liner suivant
qui produit
Il peut être intéressant de noter que sans la
print
déclaration, le bloc-notes console / jupyter ipython présente le dictionnaire dans l'ordre de leur choix ...la source
J'ai trouvé cette fonction qui ne mute pas le dictionnaire d'origine. Cette fonction prend également en charge la liste des dictionnaires.
la source
J'utilise la réponse de @wim ci-dessus, avec dict.pop () lors du changement de nom des clés, mais j'ai trouvé un problème. Faire défiler le dict pour changer les clés, sans séparer complètement la liste des anciennes clés de l'instance de dict, a entraîné le cyclage de nouvelles clés modifiées dans la boucle et la disparition de certaines clés existantes.
Pour commencer, je l'ai fait de cette façon:
J'ai trouvé qu'en parcourant le dict de cette manière, le dictionnaire continuait à trouver des clés même quand ce n'était pas le cas, c'est-à-dire les nouvelles clés, celles que j'avais changées! Je devais séparer complètement les instances les unes des autres pour (a) éviter de trouver mes propres clés modifiées dans la boucle for, et (b) trouver des clés qui n'étaient pas trouvées dans la boucle pour une raison quelconque.
Je fais ça maintenant:
La conversion de my_dict.keys () en une liste était nécessaire pour se libérer de la référence au dict changeant. Le simple fait d'utiliser my_dict.keys () m'a gardé lié à l'instance d'origine, avec les effets secondaires étranges.
la source
Dans le cas où quelqu'un souhaite renommer toutes les clés à la fois en fournissant une liste avec les nouveaux noms:
la source
@ helloswift123 J'aime votre fonction. Voici une modification pour renommer plusieurs clés en un seul appel:
la source
Supposons que vous souhaitiez renommer la clé k3 en k4:
la source
TypeError: 'dict' object is not callable
Si avectemp_dict('k3')
vous essayez de référencer la valeur de lak3
clé, vous devez utiliser des crochets et non des parenthèses. Cependant, cela ajoutera simplement une nouvelle clé au dictionnaire et ne renommera pas une clé existante, comme demandé.