【问题标题】:Overwritting dictionary 'update' method覆盖字典“更新”方法
【发布时间】:2019-05-04 17:42:07
【问题描述】:

我正在尝试继承 dict 以修改其 update 方法。

我正在寻找的行为是添加公共键的值并保留唯一的。

示例:

g1 = MyDict({1: 1, 2: 2})
g2 = MyDict({1: 1, 3: 3})
g1.update(g2)  # should result in g1 = {1: 2, 2: 2, 3: 3}
#                                          ^ because it is 1 from g1 + 1 from g2

换句话说,就像我在做:

from collections import Counter
g1 =  dict(Counter(g1) + Counter(g2))

为了这个任务,我写了以下内容:

class MyDict(dict):
    def __update__(self, d2):
        keys = set(self).union(d2)
        self = {k: self.get(k, 0) + d2.get(k, 0) for k in keys}
        return

但是在做的时候:

g1 = MyDict({1: 1, 2: 2})
g2 = MyDict({1: 1, 3: 3})
g1.update(g2)

它产生:

{1: 1, 2: 2, 3: 3}

但是,如果我这样做:

class MyDict(dict):
    def __add__(self, d2):
        keys = set(self).union(d2)
        return {k: self.get(k, 0) + d2.get(k, 0) for k in keys}

然后

g1 = g1 + g2

实现了所需的行为..

覆盖update 方法时我做错了什么?

【问题讨论】:

  • 您正在定义__update__ 方法,但您正在调用update 方法。同样__update__ 根本不修改字典,它只是返回一个新值(这里不做任何事情)。
  • @deceze 抱歉,复制粘贴错误。请再看看。
  • def __update__(self, d2):更改为def update(self, d2):
  • update__update__ 的问题仍然相同。它适用于__add__,因为+ 隐式调用__add__。但是update 并没有隐式调用__update__,因为为什么会这样呢?此外,分配给self 并没有多大作用; self 只是方法中的一个局部变量。
  • @CarlosMermingas 仅此更改不起作用。

标签: python python-3.x class dictionary subclassing


【解决方案1】:

我找到了以下方法:

class MyDict(dict):
    def update(self, d2):
        for k in set(self).union(d2):
            self[k] = self.get(k, 0) + d2.get(k, 0)
        return

确实,当这样做时:

g1 = MyDict({1: 1, 2: 2})
g2 = MyDict({1: 1, 3: 3})
g1.update(g2)

结果:

print(g1)  # -> {1: 2, 2: 2, 3: 3}

如果有更好的方法,请告诉我。

感谢cmets!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-02-24
    • 2022-01-04
    • 2014-01-04
    • 1970-01-01
    • 2020-06-14
    • 2015-12-25
    • 2017-07-22
    • 1970-01-01
    相关资源
    最近更新 更多