在不丢失订单的情况下更改OrderedDict中的密钥

frn*_*nhr 20 python ordereddictionary

从...开始

OrderedDict([('a', 1), ('c', 3), ('b', 2)])
Run Code Online (Sandbox Code Playgroud)

有可能最终结束

OrderedDict([('a', 1), ('__C__', 3), ('b', 2)])
Run Code Online (Sandbox Code Playgroud)

确保该'__C__'项目是在保持秩序之前'b'和之后'a'

MRA*_*RAB 17

你可以尝试:

>>> d = OrderedDict([('a', 1), ('c', 3), ('b', 2)])
>>> d
OrderedDict([('a', 1), ('c', 3), ('b', 2)])
>>> d2 = OrderedDict([('__C__', v) if k == 'c' else (k, v) for k, v in d.items()])
>>> d2
OrderedDict([('a', 1), ('__C__', 3), ('b', 2)])
Run Code Online (Sandbox Code Playgroud)

  • 为什么不呢:`d2 = OrdededDict([('__ C__'if k =='c'else k,v)for k,v in d.items()])? (2认同)
  • 遍历所有items()只是为了更改密钥? (2认同)

fbs*_*stj 5

如果你想改变当前的字典对象:

def change_key(self, old, new):
    for _ in range(len(self)):
        k, v = self.popitem(False)
        self[new if old == k else k] = v
Run Code Online (Sandbox Code Playgroud)

这通过迭代整个OrderedDict(使用它的长度),然后弹出它的第一个项目(通过传递False.popitem():此方法的默认值是弹出最后一个项目)kv(分别代表)来工作; 然后插入此键/值对,或者在其末尾插入具有原始值的新键OrderedDict.

通过对dict的整个大小重复该逻辑,它有效地完全旋转了dict,从而重新创建原始顺序.

  • @TahaJahangir不完全是,这个答案没有创造新的词典.这有时是期望的,有时是不希望的. (3认同)