覆盖字典的“更新”方法

时间:2018-12-03 12:09:34

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

我正在尝试将 var token = `Bearer-some.token`; var layer = new ol.layer.Vector({ source: new ol.source.Vector({ url: "Geo_JSON_URL", format: new ol.format.GeoJSON() }), style: myStyle, zIndex: 10 }) 子类化以修改其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 方法时我在做什么错了?

1 个答案:

答案 0 :(得分:3)

我找到了以下方法:

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}

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

感谢您的评论!