我有一個這樣的字典串列。
fruit = [{"apple": 10, "pear": 20, "banana": 30, "strawberry": 50},
{"apple": 12, "pear": 5, "banana": 20, "strawberry": 5},
{"apple": 15, "pear": 26, "banana": 32, "strawberry": 8}]
我可以在一行中撰寫一個 reduce 函式(使用 lambda 引數)來獲得一個具有相同鍵的新字典。新字典的每個鍵的值是對應鍵的所有值的總和。預期的輸出應該是一個字典,如下所示:
{'apple': 37.0, 'pear': 51.0, 'banana': 82.0, 'strawberry': 63.0}
uj5u.com熱心網友回復:
Util-heavy 方法:
from operator import add
from collections import Counter
from functools import reduce
reduce(add, map(Counter, fruit))
# Counter({'banana': 82, 'strawberry': 63, 'pear': 51, 'apple': 37})
或者也許對初學者更有指導意義,add為兩個字典寫一個:
def add(d1, d2):
return {k: d1.get(k, 0) d2.get(k, 0) for k in d1.keys() | d2.keys()}
reduce(add, fruit)
uj5u.com熱心網友回復:
dict-comprehension 可以完成合并兩個 dict 的作業,如下所示:
>>> from functools import reduce
>>> fruit = [{"apple": 10, "pear": 20, "banana": 30, "strawberry": 50},
... {"apple": 12, "pear": 5, "banana": 20, "strawberry": 5},
... {"apple": 15, "pear": 26, "banana": 32, "strawberry": 8}]
>>> reduce(lambda a, b: {k: a[k] v for k, v in b.items()}, fruit)
{'apple': 37, 'pear': 51, 'banana': 82, 'strawberry': 63}
這確實要求所有 dicts 具有相同的鍵,否則一些將被洗掉。更完整的版本是這個,盡管它作為一個 reduce-lambda 確實變得非常笨拙:
reduce(lambda a, b: {k: a.get(k, 0) b.get(k, 0) for k in a.keys() | b.keys()}, fruit)
uj5u.com熱心網友回復:
以下方法使用字典理解而不使用匯入。但是我不建議使用它:
{k: sum(f.get(k,0) for f in fruit) for k in {k for f in fruit for k in f}}
# | |
# -- set of all fruit keys --
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/358174.html
上一篇:python會計算洗掉的專案嗎?
