簡體   English   中英

給定一個 [string, number] 元組列表,創建一個字典,其中鍵是字符串的第一個字符,值是數字的總和

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

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