값을 새 이름으로 재 할당하고 이전 이름 키를 제거하지 않고 사전 키 이름을 바꾸는 방법이 있습니까? dict 키 / 값을 반복하지 않고?
OrderedDict의 경우 키 위치를 유지하면서 동일하게 수행하십시오.
답변
정기 dict의 경우 다음을 사용할 수 있습니다.
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')])
dict 키는 일반적 으로 숫자, 문자열 또는 튜플과 같은 변경 불가능한 객체 이므로 키 자체를 수정하는 것은이 질문이하는 것처럼 보이지 않습니다 . 키를 수정하는 대신 값을 새 키에 다시 할당하고 이전 키를 제거하는 것이 파이썬에서 “이름 바꾸기”를 달성하는 방법입니다.
답변
한 줄에 가장 좋은 방법 :
>>> d = {'test':[0,1,2]}
>>> d['test2'] = d.pop('test')
>>> d
{'test2': [0, 1, 2]}
답변
check for를 사용하면 다음 newkey!=oldkey
과 같은 작업을 수행 할 수 있습니다.
if newkey!=oldkey:
dictionary[newkey] = dictionary[oldkey]
del dictionary[oldkey]
답변
모든 사전 키의 이름을 바꾸는 경우 :
target_dict = {'k1':'v1', 'k2':'v2', 'k3':'v3'}
new_keys = ['k4','k5','k6']
for key,n_key in zip(target_dict.keys(), new_keys):
target_dict[n_key] = target_dict.pop(key)
답변
OrderedDict recipe
Raymond 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
답변
저의 몇몇 사람들 .pop
은 하나의 라이너에서 키를 삭제하고 생성하는 트릭을 언급했습니다 .
개인적으로보다 명확한 구현이 더 읽기 쉽습니다.
d = {'a': 1, 'b': 2}
v = d['b']
del d['b']
d['c'] = v
위의 코드는 {'a': 1, 'c': 2}
답변
다른 답변은 꽤 좋지만 python3.6에서는 일반 dict에도 순서가 있습니다. 따라서 정상적인 경우에는 키의 위치를 유지하기가 어렵습니다.
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