Python: Добавление элементов словаря. - PullRequest
0 голосов
/ 05 ноября 2010

Когда мы добавляем элементы словаря,

мы используем x.items()+y.items(), но было кое-что, чего я не понимаю.

, например,

, если x={2:2,1:3} и y={1:3,3:1} x.items()+y.items() дают {3:1,2:2,1:3}

, поэтому, как вы можете видеть, математически ответ мог бы быть 6x+2x^2+x^3,

но словарь дает x^3+2x^2+3x,

Может кто-нибудь сказать мне какой-нибудь лучший метод, который работает лучше?

Ответы [ 3 ]

5 голосов
/ 05 ноября 2010

Давайте выясним, что здесь происходит!

In [7]: x.items()
Out[7]: [(1, 3), (2, 2)]

In [8]: y.items()
Out[8]: [(1, 3), (3, 1)]

In [9]:  x.items() + y.items()
Out[9]: [(1, 3), (2, 2), (1, 3), (3, 1)]

In [10]: dict(x.items() + y.items())
Out[10]: {1: 3, 2: 2, 3: 1}

items() создает список (ключ, значение) кортежей, а + объединяет списки.Затем вы можете сделать этот список обратно в словарь, который будет иметь дело с дублирующимися ключами, взяв последнее значение с данным ключом.Поскольку на этот раз это дублирующее значение, это не имеет значения, но оно может:

In [11]: z = {1:4, 3:1}

In [12]: dict(x.items() + z.items())
Out[12]: {1: 4, 2: 2, 3: 1}

В этом случае запись 1: 3 отбрасывается ...

(Не ясно, чтоВаша аналогия с полиномами: ... Если вы действительно хотите представить многочлены, которые складываются арифметически, вы можете проверить numpy class poly1d или collections.Counter описывается @adw.)

2 голосов
/ 05 ноября 2010

Когда вы вызываете dict(x.items()+y.items()), дубликаты ключей просто устанавливаются дважды, и последнее установленное значение (значение из y) перезаписывает старшее (из x).

Поскольку словарь или значения в словаре Python могут содержать что угодно (если ключи могут быть хэшируемыми), как он узнает, как объединить старое и новое значение при замене ключа?

В Python 2.7 и 3 есть подкласс словаря под названием Counter, который может иметь только числа в качестве значений. И когда вы добавляете два из них вместе, он делает сложение значений вместе для дублирующих ключей:

>>> from collections import Counter
>>> Counter({2:2,1:3}) + Counter({1:3,3:1})
Counter({1: 6, 2: 2, 3: 1})
1 голос
/ 05 ноября 2010

Вы можете создать свой собственный подкласс dict, чтобы реализовать оператор добавления, чтобы делать то, что вы хотели:

import copy
class AddingDict(dict):
    def __add__(self, d2):
        new_dict = copy.deepcopy(self)
        for key, value in d2.iteritems():
            if key in new_dict:
                new_dict[key] += value
            else:
                new_dict[key] = value
        return new_dict

А теперь:

>>> x = AddingDict({2:2,1:3})
>>> y = AddingDict({1:3,3:1})
>>> x+y
{1: 6, 2: 2, 3: 1}

Редактировать

Если вам нужна дополнительная эффективность, проверка, находится ли каждый ключ в new_dict для каждого ключа в оригинале, неэффективна, и вы можете преобразовать каждый список ключей в set и взять пересечение, но код был бы более сложным, и эффективность, вероятно, не нужна.Фактическая реализация оставлена ​​читателю в качестве упражнения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...