【问题标题】:How to ensure update() adds to end of dictionary如何确保 update() 添加到字典的末尾
【发布时间】:2016-09-24 23:15:25
【问题描述】:

我读到OrderedDict 可用于将信息按顺序保存在字典中,但它似乎要求您在实例化字典本身时输入信息。

但是,我需要能够在 for 循环中多次使用 update() 并确保将每个条目添加到字典的 end 中。有没有办法做到这一点?

这是我在说什么的视觉效果

for e in entryList:
    myDict.update({e[2]: e[3]})

这会输入所有新信息,但不会保持顺序。

【问题讨论】:

标签: python dictionary


【解决方案1】:

根据文档 (https://docs.python.org/2/library/collections.html#collections.OrderedDict),您必须在添加之前删除该条目。

为方便起见,您可以将其包装在子类中..:

class MyOrderedDict(OrderedDict):
    def update(self, other):
        for k, v in other.items():
            if k in self:
                 del self[k]
            self[k] = v

虽然使用更新的方式看起来很奇怪:

myDict.update({e[2]: e[3]})

因为写起来会更清楚:

myDict[e[2]] = e[3]

要完成这项工作,您还需要覆盖 __setitem__

class MyOrderedDict(OrderedDict):
    def __setitem__(self, key, val):
        if key in self:
             del self[key]
        super(self, MyOrderedDict).__setitem__(key, val)

    def update(self, other):
        for k, v in other.items():
            self[k] = v

【讨论】:

    【解决方案2】:

    @Bob,请参阅此处的文档。 https://docs.python.org/3.5/library/collections.html?highlight=ordereddict#collections.OrderedDict

    上面写着:

    OrderedDict 构造函数和 update() 方法都接受关键字 参数,但它们的顺序丢失了,因为 Python 的函数调用 语义使用常规无序传入关键字参数 字典。

    但是,在 3.2 中添加了一个解决方法:(来自同一页面)

    move_to_end(key, last=True) 将现有键移动到键的任一端 有序字典。如果 last 为真,则该项移动到右端 (默认值)或如果 last 为 false 则到开头。引发 KeyError 如果 密钥不存在。

    我希望能回答这个问题。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-01-02
      • 2011-07-15
      • 1970-01-01
      • 2010-12-22
      • 1970-01-01
      相关资源
      最近更新 更多