當我們添加字典項目,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
,
任何人都可以告訴我更好的方法嗎?
當我們添加字典項目,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
,
任何人都可以告訴我更好的方法嗎?
讓我們清楚這裏發生了什麼!
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描述poly1d或collections.Counter
。)
你可以創建自己的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
並採用交叉點,但代碼會更復雜,效率可能不需要。實際執行情況僅供讀者參考。
當您撥打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})
你需要更好地解釋你期望得到什麼,當你「添加」詞典,特別是你爲什麼希望它做你認爲它應該,而不是它實際上做什麼...... – 2010-11-05 14:43:39
你是誰(「我們」),爲什麼你使用'x.items()+ y.items()'來「添加」兩個字典? – tzot 2010-11-07 09:37:11