복붙노트

[PYTHON] 사전 키 이름 바꾸기

PYTHON

사전 키 이름 바꾸기

그 값을 새 이름으로 재 할당하거나 이전 이름 ​​키를 제거하지 않고 사전 키의 이름을 바꾸는 방법이 있습니까? dict 키 / 값을 통해 반복하지 않고? OrderedDict의 경우 해당 키의 위치를 ​​유지하면서 동일하게 수행하십시오.

해결법

  1. ==============================

    1.일반 dict의 경우 다음을 사용할 수 있습니다.

    일반 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 키가 숫자, 문자열 또는 튜플과 같이 일반적으로 변경 불가능한 개체이기 때문에 실용적이지 않습니다. 키를 수정하는 대신 새 키에 값을 재 지정하고 이전 키를 제거하는 방법은 파이썬에서 "이름 바꾸기"를 달성하는 방법입니다.

  2. ==============================

    2.1 줄의 가장 좋은 방법 :

    1 줄의 가장 좋은 방법 :

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

    3.newkey! = oldkey에 대한 검사를 사용하면 다음과 같이 할 수 있습니다.

    newkey! = oldkey에 대한 검사를 사용하면 다음과 같이 할 수 있습니다.

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

    4.Raymond Hettinger가 작성한이 OrderedDict 레시피를 사용하여 이름 바꾸기 방법을 추가하도록 수정할 수 있지만 복잡성에서는 O (N)이됩니다.

    Raymond Hettinger가 작성한이 OrderedDict 레시피를 사용하여 이름 바꾸기 방법을 추가하도록 수정할 수 있지만 복잡성에서는 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
    
  5. ==============================

    5.몇 사람 앞에서 한 줄짜리 키를 삭제하고 작성하는 .pop 트릭을 언급했습니다.

    몇 사람 앞에서 한 줄짜리 키를 삭제하고 작성하는 .pop 트릭을 언급했습니다.

    필자는보다 명시적인 구현을보다 쉽게 ​​읽을 수있다.

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

    위의 코드는 { 'a': 1, 'c': 2}를 반환합니다.

  6. ==============================

    6.다른 대답은 꽤 좋다.하지만 python3.6에서는 정규 dict도 순서를 가진다. 따라서 일반적인 경우 키 위치를 유지하기가 어렵습니다.

    다른 대답은 꽤 좋다.하지만 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
    
  7. from https://stackoverflow.com/questions/16475384/rename-a-dictionary-key by cc-by-sa and MIT license