Zmień nazwę klucza w słowniku

Odpowiedzi:

715

Łatwo zrobić w 2 krokach:

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

Lub w 1 kroku:

dictionary[new_key] = dictionary.pop(old_key)

który podniesie, KeyErrorjeśli nie dictionary[old_key]jest zdefiniowany. Zauważ, że to będzie usunąć 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
źródło
59
Spowoduje to podniesienie błędu w obu kierunkach, jeśli klucz nie istnieje, ale możesz tego dict[new_value] = dict.pop(old_value, some_default_value)uniknąć
Tobias Kienzler
2
Zauważ, że wpłynie to również na pozycję klucza w CPython 3.6+ / Pypy i Python 3.7+. To jest na ogół pozycja old_keybędzie inna niż pozycja new_key.
norok2
63

jeśli chcesz zmienić wszystkie klucze:

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}

jeśli chcesz zmienić pojedynczy klucz: możesz przejść do dowolnej z powyższych sugestii.

Tauquir
źródło
3
To tworzy nowy słownik zamiast aktualizować istniejący - co może nie być ważne, ale nie jest tym, o co pytano.
martineau,
15
Ta sama odpowiedź ze słownikiem:{ 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
źródło
26

W Pythonie 2.7 i nowszych możesz używać rozumienia słownikowego: Oto przykład, który napotkałem podczas czytania pliku CSV przy użyciu DictReadera. Użytkownik sufikował wszystkie nazwy kolumn sufiksem „:”

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

pozbyć się końcowego „:” w klawiszach:

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

Oddział
źródło
„AttributeError: obiekt„ dict ”nie ma atrybutu„ zamień ””
user1318135
2
user1318125, sugerowałbym wypróbowanie kopiowania wklej. Działa to dla mnie w konsoli Pythona (.replace jest wykonywany na łańcuchu, który jest używany jako klucz)
north.mister 28.07.16
7

Ponieważ klucze służą do wyszukiwania wartości w słownikach, nie można ich tak naprawdę zmienić. Najbliższe, co możesz zrobić, to zapisać wartość powiązaną ze starym kluczem, usunąć go, a następnie dodać nowy wpis z kluczem zastępczym i zapisaną wartością. Kilka innych odpowiedzi ilustruje różne sposoby osiągnięcia tego celu.

martineau
źródło
5

Jeśli masz skomplikowany dykt, oznacza to, że dykt lub lista znajduje się w nim:

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
źródło
4

Nie ma bezpośredniego sposobu, aby to zrobić, ale możesz usunąć, a następnie przypisać

d = {1:2,3:4}

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

lub dokonaj masowych zmian klucza:

d = dict((changeKey(k), v) for k, v in d.items())
AndiDog
źródło
2
d = { changeKey(k): v for k, v in d.items()}
Erich
4

Aby przekonwertować wszystkie klucze w słowniku

Załóżmy, że to jest twój słownik:

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

Aby przekonwertować wszystkie myślniki na podkreślenia w przykładowym kluczu słownika:

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

załóżmy, że chcemy zmienić klucze do elementów listy p = ['a', 'b']. zrobi następujący kod:

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

i dostajemy

{'a': 2, 'b': 4}
Ksreenivas Karanam
źródło
0

Możesz powiązać tę samą wartość z wieloma kluczami lub po prostu usunąć klucz i ponownie dodać nowy klucz o tej samej wartości.

Na przykład, jeśli masz klucze-> wartości:

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

nie ma powodu, dla którego nie można dodawać, purple->2usuwać red->1ani dodawaćorange->1

DGH
źródło
0

W przypadku zmiany wszystkich kluczy jednocześnie. Tutaj pobieram klucze.

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
źródło
-3

Nie widziałem tej dokładnej odpowiedzi:

dict['key'] = value

Możesz to nawet zrobić, aby sprzeciwić się atrybutom. Przekształć je w słownik, wykonując następujące czynności:

dict = vars(obj)

Następnie możesz manipulować atrybutami obiektu, tak jak w słowniku:

dict['attribute'] = value
Mika
źródło
1
Nie widzę związku tego z pytaniem; czy mógłbyś opracować?
apraetor