Czy istnieje sposób zmiany nazwy klucza słownika, bez ponownego przypisywania jego wartości do nowej nazwy i usuwania starego klucza nazwy; i bez iteracji poprzez klucz/wartość dyktowania?
W przypadku OrderedDict, zrób to samo, zachowując pozycję tego klucza.Zmień nazwę klucza słownika
Odpowiedz
Korzystanie czek na newkey!=oldkey
, w ten sposób można zrobić:
if newkey!=oldkey:
dictionary[newkey] = dictionary[oldkey]
del dictionary[oldkey]
Dla zwykłego dict, można użyć:
mydict[new_key] = mydict.pop(old_key)
Dla OrderedDict, myślę, że trzeba zbudować zupełnie nowy za pomocą zrozumienia.
>>> OrderedDict(zip('123', 'abc'))
OrderedDict([('1', 'a'), ('2', 'b'), ('3', 'c')])
>>> oldkey, newkey = '2', 'potato'
>>> OrderedDict((newkey if k == oldkey else k, v) for k, v in _.viewitems())
OrderedDict([('1', 'a'), ('potato', 'b'), ('3', 'c')])
Modyfikowanie samego klucza, jak ta kwestia wydaje się pytać, jest niepraktyczne, ponieważ klucze dict są zwykle niezmienne obiekty, takie jak numery, ciągi lub krotek. Zamiast próbować modyfikować klucz, ponowne przypisanie wartości do nowego klucza i usunięcie starego klucza jest sposobem uzyskania "zmiany nazwy" w pythonie.
Można użyć tej OrderedDict recipe
napisany przez Raymond Hettinger i zmodyfikować go dodać metodę rename
, ale to będzie O (N) złożoności:
def rename(self,key,new_key):
ind = self._keys.index(key) #get the index of old key, O(N) operation
self._keys[ind] = new_key #replace old key with new key in self._keys
self[new_key] = self[key] #add the new key, this is added at the end of self._keys
self._keys.pop(-1) #pop the last item in self._keys
Przykład:
dic = OrderedDict((("a",1),("b",2),("c",3)))
print dic
dic.rename("a","foo")
dic.rename("b","bar")
dic["d"] = 5
dic.rename("d","spam")
for k,v in dic.items():
print k,v
wyjściowa:
OrderedDict({'a': 1, 'b': 2, 'c': 3})
foo 1
bar 2
c 3
spam 5
Wygląda na bardzo dobre podejście, ale jak mogę dodać to do mojego skryptu? – MERose
@MERose Dodaj plik Pythona gdzieś w ścieżce wyszukiwania modułu i zaimportuj z niego 'OrderedDict'. Ale polecam: Utwórz klasę dziedziczącą po 'OrderedDict' i dodaj do niej metodę' rename'. –
najlepsza metoda w 1 linii:
>>> d = {'test':[0,1,2]}
>>> d['test2'] = d.pop('test')
>>> d
{'test2': [0, 1, 2]}
co jeśli masz 'd = {('test', 'foo'): [0,1,2]}'? –
@PetrFedosov, następnie robisz 'd [('new', 'key')] = d.pop (('test', 'foo'))' –
Ta odpowiedź nadeszła dwa lata po odpowiedzi Wima, która sugeruje dokładnie to samo rzecz bez dodatkowych informacji. czego mi brakuje? –
Kilka osób przede mną wspomniał o .pop
sztuczki, aby usunąć i utworzyć klucz w jednej liniowej.
Ja osobiście znaleźć bardziej wyraźny wdrożenie bardziej czytelny:
d = {'a': 1, 'b': 2}
v = d['b']
del d['b']
d['c'] = v
Powyższy kod zwraca {'a': 1, 'c': 2}
- 1. Zmiana klucza słownika
- 2. Zmień nazwę/nazwę użytkownika cygwin
- 3. Jak zmienić nazwę klucza w Cassandra?
- 4. Zmień nazwę w Xcode
- 5. Zmień nazwę ASP.NET_SessionId
- 6. Zmień nazwę wyjściową CPack
- 7. iPhone Zmień nazwę aplikacji
- 8. Zmień nazwę nagłówka tabeli
- 9. Zmień nazwę Tabela dziedziny
- 10. Zmień nazwę modelu na mongoidę
- 11. Uczyń git ignorować zmień nazwę
- 12. Zmień nazwę katalogu w hdfs
- 13. Zmień nazwę pracy w jenkins
- 14. Zmień nazwę sterowania w XAML
- 15. Mongodb - Zmień nazwę bazy danych
- 16. Zmień nazwę folderu aplikacji Yeomana
- 17. Zmień nazwę instancji serwera sql
- 18. Zmień nazwę sekwencji w postgreSQL
- 19. Zmień nazwę oddziału w Gitkraken?
- 20. Symfony VichUploaderBundle zmień nazwę pliku
- 21. LINQ do słownika z klucza i listy
- 22. Sortowanie tablic zmiennych za pomocą klucza słownika
- 23. Używanie tablicy logicznej jako niestandardowego klucza słownika
- 24. python: iteracyjne nad słownika klasyfikowane według klucza
- 25. Python: Jak sortować słownika według klucza
- 26. chrome.storage.local.set stosując zmienny nazwę klucza
- 27. Zmień nazwę właściwości i zmień wartości wielu obiektów.
- 28. Zmień podstawową kolumnę klucza w SQL Server
- 29. ProGuard zachowaj nazwę klasy, ale zmień nazwę pakietu na
- 30. Zmień nazwę lokalną nazwę użytkownika root @ gospodarz mySQL
co dokładnie masz na myśli przez „bez realokacja jej wartość na nową nazwą i usunięcie starej nazwy klucza "? tak jak ja to widzę, to jest definicja zmiany nazwy klucza, a wszystkie odpowiedzi poniżej ponownie przypisać wartość i usunąć starą nazwę klucza. nie zaakceptowałeś jeszcze odpowiedzi, więc może ci nie osiągnęli tego, czego szukasz? – dbliss