Переписывание словаря методом «обновления» - PullRequest
0 голосов
/ 03 декабря 2018

Я пытаюсь подкласс 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?

1 Ответ

0 голосов
/ 03 декабря 2018

Я нашел следующий способ сделать это:

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}

Если есть лучший способ, дайте мне знать.

Спасибо за комментарии!

...