2010-11-05 150 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

你需要更好地解釋你期望得到什麼,當你「添加」詞典,特別是你爲什麼希望它做你認爲它應該,而不是它實際上做什麼...... – 2010-11-05 14:43:39

+0

你是誰(「我們」),爲什麼你使用'x.items()+ y.items()'來「添加」兩個字典? – tzot 2010-11-07 09:37:11

回答

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類由@adw描述poly1dcollections.Counter。)

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})