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

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.


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}
>>> 

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() }


"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.


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'}}

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())

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'}

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}

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


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

-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

1
Je ne vois pas comment cela est lié à la question; pourriez-vous développer?
apraetor
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.