[英]Sorting dictionary - functools.reduce ignores negative values?
我有一本像下面這樣的字典:
d = [{152: 1}, {151: 3}, {152: 4}, {153: 5}, {153: 10}, {154: -0.1}]
我想對它們進行如下排序:
{151: 3, 152: 5, 153: 15, 154: -0.1}
我按照這個答案嘗試了以下...
sorted = dict(functools.reduce(operator.add, map(collections.Counter, d)))
我得到的 output 是:
{151: 3, 152: 5, 153: 15}
我不明白為什么functools.reduce(operator.add, )
刪除{154: -0.1}
。 不是operator.add
只是一個簡單的求和方法嗎?
運算符.add(a, b)
操作員。 添加(a,b)
對於 a 和 b 數字,返回 a + b。
問題
functools.reduce(operator.add, )
刪除負值?計數器 class 專為正計數而設計,因此 -0.1 通過其加法方法被視為 0(與任何其他負結果一樣)。 您可以使用循環和常規字典(不需要庫)來做到這一點:
dicts = [{152: 1}, {151: 3}, {152: 4}, {153: 5}, {153: 10}, {154: -0.1}]
r = dict()
for d in dicts:
r.update({k:r.get(k,0)+v for k,v in d.items()})
print(r)
{152: 5, 151: 3, 153: 15, 154: -0.1}
Counter 的文檔指出,每個操作都可以接受帶符號計數的輸入,但 output 將排除計數為零或更少的結果
pandas
解決方案
>>>import pandas as pd
>>>d = [{152: 1}, {151: 3}, {152: 4}, {153: 5}, {153: 10}, {154: -0.1}]
>>>pd.DataFrame(d).sum().to_dict()
{152: 5.0, 151: 3.0, 153: 15.0, 154: -0.1}
operator.add
是一個普通的求和方法,請看它的源碼:operator.add
為什么functools.reduce(operator.add, )
刪除負值?
你的一行代碼相當於Counter({152: 1}) + Counter({151: 3}) + Counter({152: 4}) + Counter({153: 5}) + Counter({153: 10}) + Counter({154: -0.1})
但是, Counter
的add
方法會刪除負值,請查看其來源: counter-add
因此,鍵154
的值將被忽略。
如何完成你的工作?
t = {}
for i in d:
for k in i.keys():
t[k] = t[k]+i[k] if k in t else i[k]
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.