その値を新しい名前に再割り当てしたり、古い名前のキーを削除したりせずに、辞書のキーの名前を変更する方法はありますか? dictキー/値を反復せずに?
OrderedDict の場合、そのキーの位置を維持しながら、同じことを行います。
354058 次
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 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
于 2013-05-10T05:30:11.260 に答える