【问题标题】:change key in OrderedDict without losing order在 OrderedDict 中更改键而不丢失顺序
【发布时间】:2012-08-22 11:10:55
【问题描述】:

开始

OrderedDict([('a', 1), ('c', 3), ('b', 2)])

有没有可能结束

OrderedDict([('a', 1), ('__C__', 3), ('b', 2)])

确保'__C__' 项目在'b' 之前和'a' 之后,即保持秩序?

【问题讨论】:

  • 您需要创建一个新的 OrderedDict 或在c 之后的每个项目上使用move_to_end 方法
  • 你不能像 list 那样高效地做到这一点。如果字典很大并且您需要这样做,那么OrderedDict 可能不是数据结构的最佳选择

标签: python ordereddictionary


【解决方案1】:

你可以试试:

>>> 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)])

【讨论】:

  • 为什么不:d2 = OrdededDict([('__C__' if k == 'c' else k, v) for k, v in d.items()])
  • 遍历所有 items() 只是为了更改密钥?
【解决方案2】:

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

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

这通过迭代整个OrderedDict(使用它的长度)和pop'ing its first item(通过将False 传递给.popitem():此方法的默认设置是弹出最后一项)进入kv(分别代表keyvalue);然后在OrderedDict 的末尾插入这个键/值对,或带有原始值的新键。

通过对整个字典大小重复此逻辑,它有效地完全旋转字典,从而重新创建原始顺序。

【讨论】:

  • 同上,但更长
  • @TahaJahangir 不完全是,这个答案不会创建新的字典。这有时是合意的,有时是不合意的。
  • 这种(完全不同的)方法有价值的原因是它更新了传递给函数的原始字典引用,因此更改将影响外部范围。给出的其他解决方案都无法做到这一点。
猜你喜欢
  • 1970-01-01
  • 2019-04-26
  • 1970-01-01
  • 1970-01-01
  • 2017-12-07
  • 2014-12-01
  • 1970-01-01
  • 2015-03-24
  • 2011-07-25
相关资源
最近更新 更多