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