重命名字典键

有没有一种方法来重命名字典键,而不重新分配它的值到一个新的名称和删除旧的名称键; 并没有迭代通过键值/值?

在OrderedDict的情况下,做同样的事情,同时保持该键的位置。

对于一个正规的字典,你可以使用:

mydict[new_key] = mydict.pop(old_key) 

对于OrderedDict,我认为你必须用理解来构build一个全新的。

 >>> 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')]) 

正如这个问题似乎要求,修改密钥本身是不切实际的,因为字典密钥通常是不可变的对象,如数字,string或元组。 而不是试图修改密钥,重新分配值到一个新的密钥,并删除旧的密钥是如何实现在Python中的“重命名”。

1行最好的方法:

 >>> d = {'test':[0,1,2]} >>> d['test2'] = d.pop('test') >>> d {'test2': [0, 1, 2]} 

使用检查newkey!=oldkey ,这样你可以做:

 if newkey!=oldkey: dictionary[newkey] = dictionary[oldkey] del dictionary[oldkey] 

你可以使用Raymond Hettinger编写的OrderedDict recipe ,并修改它来添加一个rename方法,但是这将是一个O(N)的复杂性:

 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 

例:

 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 

输出:

 OrderedDict({'a': 1, 'b': 2, 'c': 3}) foo 1 bar 2 c 3 spam 5