사전 키 이름 바꾸기 키 이름을 바꾸는 방법이 있습니까? dict 키

값을 새 이름으로 재 할당하고 이전 이름 ​​키를 제거하지 않고 사전 키 이름을 바꾸는 방법이 있습니까? 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 recipeRaymond 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