有没有一种方法来重命名辞典键,没有它的价值重新分配到一个新的名称,并删除旧文件的关键; 而无需通过字典键/值迭代?
在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()让我绑在原来的实例,用奇怪的副作用。