簡體   English   中英

排序字典 - functools.reduce 忽略負值?

[英]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。

問題

  • 實現所需 output 的解決方法是什么?
  • 為什么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})

但是, Counteradd方法會刪除負值,請查看其來源: 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM