重写字典'update'方法



我正在尝试对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方法时,我做错了什么?

我找到了以下方法:

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}

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

谢谢你的评论!

最新更新