python Counter,Sum 相關(guān)隨想

首先,有個數(shù)組:

old = [
    {
        'currency': 'u',
        'number': 100
    },
    {
        'currency': 'b',
        'number': 100
    }
    , {
        'currency': 'b',
        'number': 100
    }, {
        'currency': 'c',
        'number': 100
    }
]

我想使它轉(zhuǎn)換成:

{'u': 100, 'b': 200, 'c': 100}

常規(guī)做法:

data = {
        'c': [],
        'b': [],
        'u': [],
}

for item in old:
    if item['currency'] == 'c':
        data['c'].append(item['number'])
    if item['currency'] == 'u':
        data['u'].append(item['number'])
    if item['currency'] == 'b':
        data['b'].append(item['number'])
new = dict((k,sum(v))for k,v in data.items())

還有什么更簡單快捷的方法?其實只要用一行代碼:

new = dict(sum([Counter({item['currency']: item['number']}) for item in old], Counter()))

雖然只有一行,但是其實里面有不少技巧

1. Counter 的使用

Counter()collections包下面的類,要用的時候,記得from collections import Counter
Counter 返回值是一個Counter類,類似于dictionary的形式,用dic()方法使其轉(zhuǎn)化為dictionary。

a = [1,4,2,3,2,3,4,2]  
from collections import Counter  
print Counter(a)  
print Counter(a).most_common(2)  

out:

Counter({2: 3, 4: 2, 3: 2, 1: 1})
[(2, 3), (4, 2)]
  1. sum 的用法
    sum 的用法很簡答,就是將數(shù)組里面的所有元素相加,例如還是上面的數(shù)組
sum(a)

返回21
但是,如果將Counter 元素相加呢?

[Counter({item['currency']: item['number']}) for item in old]

這個就是一個list,能不能sum這個list呢?

TypeError: unsupported operand type(s) for +: 'int' and 'Counter'

我們會發(fā)現(xiàn)有這個error.但是問題是,我們只是將Counter相加,為什么會有int 呢?
我們看一下sum的解釋:

sum by 菜鳥函數(shù)

所以,sum()函數(shù)是有一個初始值的,如果我們重寫sum()函數(shù),那么

def sum(values, start = 0):
    total = start
    for value in values:
        total = total + value
    return total

就是這樣,如果任何不是int類型的相加,我們都需要一個初始值,Counter()的初始值就是一個空的Counter().這樣再理解,就容易的多了

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容