Changer le nom d'une clé dans le dictionnaire

Réponses:

715

Facile à réaliser en 2 étapes:

dictionary[new_key] = dictionary[old_key]
del dictionary[old_key]

Ou en 1 étape:

dictionary[new_key] = dictionary.pop(old_key)

qui augmentera KeyErrorsi dictionary[old_key]n'est pas défini. Notez que cela va supprimer dictionary[old_key].

>>> dictionary = { 1: 'one', 2:'two', 3:'three' }
>>> dictionary['ONE'] = dictionary.pop(1)
>>> dictionary
{2: 'two', 3: 'three', 'ONE': 'one'}
>>> dictionary['ONE'] = dictionary.pop(1)
Traceback (most recent call last):
  File "<input>", line 1, in <module>
KeyError: 1
moinudin
la source
59
Cela soulèvera une erreur de clé dans les deux cas si la clé n'est pas existante, mais vous pouvez l'utiliser dict[new_value] = dict.pop(old_value, some_default_value)pour éviter cela
Tobias Kienzler
2
Notez que cela affecterait également la position de la clé dans CPython 3.6+ / Pypy et Python 3.7+. C'est en général la position de old_keysera différente de la position de new_key.
norok2
63

si vous voulez changer toutes les clés:

d = {'x':1, 'y':2, 'z':3}
d1 = {'x':'a', 'y':'b', 'z':'c'}

In [10]: dict((d1[key], value) for (key, value) in d.items())
Out[10]: {'a': 1, 'b': 2, 'c': 3}

si vous souhaitez modifier une seule touche: vous pouvez suivre l'une des suggestions ci-dessus.

Tauquir
la source
3
Cela crée un nouveau dictionnaire plutôt que de mettre à jour un dictionnaire existant - ce qui n'est peut-être pas important, mais ce n'est pas ce qui a été demandé.
martineau
15
Même réponse avec une compréhension du dictionnaire:{ d1[key] : value for key, value in d.items() }
Morwenn
35

pop'n'fresh

>>>a = {1:2, 3:4}
>>>a[5] = a.pop(1)
>>>a
{3: 4, 5: 2}
>>> 
kevpie
la source
26

En python 2.7 et supérieur, vous pouvez utiliser la compréhension du dictionnaire: Ceci est un exemple que j'ai rencontré lors de la lecture d'un CSV à l'aide d'un DictReader. L'utilisateur avait suffixé tous les noms de colonne avec ':'

ori_dict = {'key1:' : 1, 'key2:' : 2, 'key3:' : 3}

se débarrasser de la fin «:» dans les touches:

corrected_dict = { k.replace(':', ''): v for k, v in ori_dict.items() }

quartier
la source
"AttributeError: l'objet 'dict' n'a pas d'attribut 'replace'"
user1318135
2
user1318125, je suggère d'essayer de copier-coller. Cela fonctionne pour moi dans la console python (le .replace est exécuté sur la chaîne utilisée comme clé)
north.mister
7

Étant donné que les clés sont ce que les dictionnaires utilisent pour rechercher des valeurs, vous ne pouvez pas vraiment les modifier. La chose la plus proche que vous pouvez faire est d'enregistrer la valeur associée à l'ancienne clé, de la supprimer, puis d'ajouter une nouvelle entrée avec la clé de remplacement et la valeur enregistrée. Plusieurs des autres réponses illustrent différentes manières d'y parvenir.

martineau
la source
5

Si vous avez un dict complexe, cela signifie qu'il y a un dict ou une liste dans le dict:

myDict = {1:"one",2:{3:"three",4:"four"}}
myDict[2][5] = myDict[2].pop(4)
print myDict

Output
{1: 'one', 2: {3: 'three', 5: 'four'}}
Hatem
la source
4

Pas de moyen direct de le faire, mais vous pouvez supprimer puis attribuer

d = {1:2,3:4}

d[newKey] = d[1]
del d[1]

ou effectuez des modifications de masse:

d = dict((changeKey(k), v) for k, v in d.items())
AndiDog
la source
2
d = { changeKey(k): v for k, v in d.items()}
Erich
4

Pour convertir toutes les clés du dictionnaire

Supposons que ce soit votre dictionnaire:

>>> sample = {'person-id': '3', 'person-name': 'Bob'}

Pour convertir tous les tirets en traits de soulignement dans l'exemple de clé de dictionnaire:

>>> sample = {key.replace('-', '_'): sample.pop(key) for key in sample.keys()}
>>> sample
>>> {'person_id': '3', 'person_name': 'Bob'}
Pranjal Singi
la source
3
d = {1:2,3:4}

supposons que nous voulons changer les clés des éléments de liste p = ['a', 'b']. le code suivant fera:

d=dict(zip(p,list(d.values()))) 

et nous obtenons

{'a': 2, 'b': 4}
Ksreenivas Karanam
la source
0

Vous pouvez associer la même valeur à plusieurs clés, ou simplement supprimer une clé et rajouter une nouvelle clé avec la même valeur.

Par exemple, si vous avez des clés-> valeurs:

red->1
blue->2
green->4

il n'y a aucune raison pour que vous ne puissiez pas ajouter purple->2ou supprimer red->1et ajouterorange->1

DGH
la source
0

En cas de changement de toutes les clés à la fois. Ici, j'enfonce les clés.

a = {'making' : 1, 'jumping' : 2, 'climbing' : 1, 'running' : 2}
b = {ps.stem(w) : a[w] for w in a.keys()}
print(b)
>>> {'climb': 1, 'jump': 2, 'make': 1, 'run': 2} #output
Ananth Kumar Vasamsetti
la source
-3

Je n'ai pas vu cette réponse exacte:

dict['key'] = value

Vous pouvez même le faire pour les attributs d'objet. Faites-en un dictionnaire en procédant comme suit:

dict = vars(obj)

Ensuite, vous pouvez manipuler les attributs d'objet comme vous le feriez pour un dictionnaire:

dict['attribute'] = value
MicahT
la source
1
Je ne vois pas comment cela est lié à la question; pourriez-vous développer?
apraetor