[英]Given a list of [string, number] tuples, create a dictionary where keys are the first characters of strings and the values are sums of the numbers
我有一個元組列表,其中第一個 object 是一個字符串,第二個是一個數字。 我需要創建一個字典,使用字符串的第一個字母作為鍵和數字(或者如果鍵相同,我需要添加一些數字)作為值。 例如:
輸入
lst = [('Alex', 5), ('Addy', 7), ('Abdul', 2), ('Bob', 6), ('Carl', 8), ('Cal', 4)]
output
dct = {'A': 14, 'B': 6, 'C': 12}
最簡單、直接和幼稚的方法是:
dct = {}
for k, v lst:
if k in v:
dct[k] += v
else:
dct[k] = v
有一些方法可以逐漸變得更聰明,第一種可能是使用.get
和默認值:
dct = {}
for k, v in lst:
dct[k] = dct.get(k, 0) + v
最后,您可以使用collections.defaultdict
,它采用“工廠” function 如果密鑰不存在將被調用,使用int
作為因素:
from collections import defaultdict
dct = defaultdict(int)
for k, v in lst:
dct[k] += v
注意:創建一個常規的字典通常更安全,以避免默認行為:
dct = dict(dct)
甚至
dct.default_factory = None
最后,一種更靈活的方法是創建自己的dict
子類並使用__missing__
,如果在設置默認值時需要訪問鍵,這很有用,所以在這里不是特別有用,但為了完成:
class AggDict(dict):
def __missing__(self, key):
return 0
dct = AggDict()
for k, v in dct:
dct[k] += v
使用defaultdict
:
dct = defaultdict(int) # default to 0
for name, val in lst:
dct[name[0]] += val
dct = dict(dct) # get rid of default value
您可以使用 collections 中的 Counter 將元組轉換為可計數的鍵/值,然后使用 functools 中的 reduce 將它們相加:
from collections import Counter
from functools import reduce
lst = [('Alex', 5), ('Addy', 7), ('Abdul', 2), ('Bob', 6), ('Carl', 8), ('Cal', 4)]
dst = reduce(Counter.__add__,(Counter({k[:1]:v}) for k,v in lst))
# Counter({'A': 14, 'C': 12, 'B': 6})
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.