重命名字典键(Rename a dictionary key)

2019-09-02 11:20发布

有没有一种方法来重命名辞典键,没有它的价值重新分配到一个新的名称,并删除旧文件的关键; 而无需通过字典键/值迭代?

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

Answer 1:

对于一个普通字典,你可以使用:

mydict[new_key] = mydict.pop(old_key)

对于OrderedDict,我认为你必须建立使用理解一个完全新的。

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

修改密钥本身,因为这个问题好像是问,是不切实际的,因为字典键通常是不可变的对象,如数字,字符串或元组。 而不是试图修改注册表项,重新分配值到一个新的密钥并删除旧的关键是你如何能做到在Python中“重命名”。



Answer 2:

在1行的最佳方法:

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


Answer 3:

使用支票newkey!=oldkey这样你可以这样做:

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


Answer 4:

您可以使用此OrderedDict recipe雷蒙德的Hettinger撰写并修改它来添加一个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


Answer 5:

我之前有几个人提到.pop把戏删除并创建一个班轮的关键。

我个人觉得更明确的实施更具可读性:

d = {'a': 1, 'b': 2}
v = d['b']
del d['b']
d['c'] = v

上述返回代码{'a': 1, 'c': 2}



Answer 6:

其他答案在python3.6相当好。不过,普通字典也有秩序。 因此,它是很难保持在正常情况下,关键的位置。

def rename(old_dict,old_name,new_name):
    new_dict = {}
    for key,value in zip(old_dict.keys(),old_dict.values()):
        new_key = key if key != old_name else new_name
        new_dict[new_key] = old_dict[key]
    return new_dict


Answer 7:

即使它的字典的名单只是把它转换成字符串。

注意 :请确保您没有值的名称相同的键名。

可能工作的人

import json
d = [{'a':1,'b':2},{'a':2,'b':3}]
d = json.loads(json.dumps(d).replace('"a"','"newKey"'))


Answer 8:

我使用@wim的回答以上,具有dict.pop重命名键的时候,但我发现了一个疑难杂症()。 通过快译通循环改变按键,而从字典实例完全分离旧密钥列表中,导致骑车的新,改键进入死循环,而缺少一些现有密钥。

首先,我这样做的:

for current_key in my_dict:
    new_key = current_key.replace(':','_')
    fixed_metadata[new_key] = fixed_metadata.pop(current_key)

我发现,通过这样的循环字典,词典不停寻找钥匙,即使它不应该,即新的密钥,那些我已经改变了! 我需要的情况下相互完全分离,以(一)避免发现我自己改变键在for循环,和(b)发现,没有被循环出于某种原因中发现了一些按键。

我现在这样做:

current_keys = list(my_dict.keys())
for current_key in current_keys:
    and so on...

在my_dict.keys()转换到一个列表是必要得到免费的参考变化的字典中。 只用my_dict.keys()让我绑在原来的实例,用奇怪的副作用。



文章来源: Rename a dictionary key