2010-11-05 2 views
-2

Когда мы добавляем словарные статьи,Python: добавление элементов словаря.

мы используем 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

Вы должны лучше объяснить, что вы ожидаете получить, когда вы «добавить» словари, и, в частности, почему вы ожидаете он должен делать то, что, по вашему мнению, должен скорее, чем то, что он на самом деле делает ... –

+0

Кто вы («мы») и почему вы используете 'x.items() + y.items()' для добавления двух словарей ? – tzot

ответ

5

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

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 класс poly1d или collections.Counter описываемых @adw.)

1

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

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 и пересечь границу, но код будет более сложным и эффективность, скорее всего, не понадобится. Фактическая реализация остается как упражнение для читателя.

2

При вызове 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}) 
Смежные вопросы