590

その値を新しい名前に再割り当てしたり、古い名前のキーを削除したりせずに、辞書のキーの名前を変更する方法はありますか? dictキー/値を反復せずに?

OrderedDict の場合、そのキーの位置を維持しながら、同じことを行います。

4

13 に答える 13

1001

通常の辞書の場合、次を使用できます。

mydict[k_new] = mydict.pop(k_old)

これにより、アイテムが dict の末尾に移動します。ただし、k_new既に存在していた場合は、その場で値が上書きされます。

さらに順序を保持したいPython 3.7+ dictの場合、最も簡単なのは完全に新しいインスタンスを再構築することです。たとえば、キーの名前を次のように変更2'two'ます。

>>> d = {0:0, 1:1, 2:2, 3:3}
>>> {"two" if k == 2 else k:v for k,v in d.items()}
{0: 0, 1: 1, 'two': 2, 3: 3}

OrderedDict同じことが、辞書内包表記構文を使用できない場合にも当てはまりますが、ジェネレーター式を使用できます。

OrderedDict((k_new if k == k_old else k, v) for k, v in od.items())

質問が要求するように、キー自体を変更することは実用的ではありません。キーはハッシュ可能であるため、通常、キーは不変であり、変更できないことを意味します。

于 2013-05-10T04:58:21.833 に答える
35

のチェックを使用するとnewkey!=oldkey、次のことができます。

if newkey!=oldkey:  
    dictionary[newkey] = dictionary[oldkey]
    del dictionary[oldkey]
于 2013-05-10T04:54:44.717 に答える
12

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
于 2013-05-10T05:30:11.260 に答える