首先换况,有個(gè)數(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())
還有什么更簡單快捷的方法率触?其實(shí)只要用一行代碼:
new = dict(sum([Counter({item['currency']: item['number']}) for item in old], Counter()))
雖然只有一行抵碟,但是其實(shí)里面有不少技巧
1. Counter 的使用
Counter()
是collections
包下面的類,要用的時(shí)候贷盲,記得from collections import Counter
Counter 返回值是一個(gè)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)]
- sum 的用法
sum 的用法很簡答铝穷,就是將數(shù)組里面的所有元素相加,例如還是上面的數(shù)組
sum(a)
返回21
但是佳魔,如果將Counter 元素相加呢曙聂?
[Counter({item['currency']: item['number']}) for item in old]
這個(gè)就是一個(gè)list,能不能sum這個(gè)list呢鞠鲜?
TypeError: unsupported operand type(s) for +: 'int' and 'Counter'
我們會(huì)發(fā)現(xiàn)有這個(gè)error.但是問題是宁脊,我們只是將Counter相加,為什么會(huì)有int 呢贤姆?
我們看一下sum的解釋:
所以榆苞,
sum()
函數(shù)是有一個(gè)初始值的,如果我們重寫sum()
函數(shù)霞捡,那么
def sum(values, start = 0):
total = start
for value in values:
total = total + value
return total
就是這樣坐漏,如果任何不是int類型的相加,我們都需要一個(gè)初始值碧信,Counter()的初始值就是一個(gè)空的Counter().這樣再理解仙畦,就容易的多了