簡體   English   中英

讀取並添加字典中相同鍵的值

[英]Read and add the values of same keys in dictionary

我正在嘗試添加相同鍵的字典的值。 在下面的示例中,當嘗試添加“相同”鍵的值時,我剝離了每個鍵的版本號。

item_dict = {
"item_C_v001" : 100,
"item_C_v002" : 100,
"item_A_v001" : 50,
"item_B_v001" : 75
}

我的預期輸出應為:

"item_C_v" : 200,
"item_A_v" : 50,
"item_B_v" : 75

但是相反,如果嘗試打印item_dict得到以下item_dict

"item_C_v" : 100,
"item_A_v" : 50,
"item_B_v" : 75

但是,當我嘗試剝離時,似乎item_C_v被讀取一次。 如何使其讀為“兩次”,這樣我就可以得到200作為輸出?

您可以使用collections.defaultdict(int)來對結果進行分組和求和,例如可以使用正則表達式來獲得鍵的所需部分。 遵循以下原則:

In [1]: from collections import defaultdict

In [2]: import re

In [3]: item_dict = {
   ...: "item_C_v001" : 100,
   ...: "item_C_v002" : 100,
   ...: "item_A_v001" : 50,
   ...: "item_B_v001" : 75
   ...: }

In [4]: result = defaultdict(int)

In [5]: for key, value in item_dict.items():
   ...:     result[re.search(r"(\w+?)\d+", key).group(1)] += value   

In [6]: dict(result)
Out[6]: {'item_A_v': 50, 'item_B_v': 75, 'item_C_v': 200}

您可以使用str.partition()不同地提取鍵的所需部分:

>>> key = "item_C_v001"
>>> "".join(key.partition("_v")[:-1])
'item_C_v'

或者,僅通過切片,如果子字符串在數字前的長度或字符串末尾的位數是恆定的:

>>> key = "item_C_v001"
>>> key[:8]
'item_C_v'
>>> key[:-3]
'item_C_v'

或者,通過右擊數字:

>>> import string
>>> key.rstrip(string.digits)
'item_C_v'

您可以迭代原始詞典,然后將新鍵添加到新詞典中,如果鍵已經存在,請將當前值添加到原始值中。

item_dict = {
"item_C_v001" : 100,
"item_C_v002" : 100,
"item_A_v001" : 50,
"item_B_v001" : 75
}

new_dict = {}

for k, v in item_dict.items():
    k_new = k[:-3]
    new_dict[k_new] = new_dict[k_new] + v if k_new in new_dict.keys() else v

print (new_dict)

>>> {'item_A_v': 50, 'item_C_v': 200, 'item_B_v': 75}

您可以使用itertools.groupby()來收集所有相似的鍵,然后構造一個新的字典來匯總所有組值,例如:

>>> import itertools as it
>>> {gk: sum(item_dict[k] for k in g) for gk, g in it.groupby(item_dict, lambda k: k[:-3])}
{'item_A_v': 50, 'item_B_v': 75, 'item_C_v': 200}

@alecxe描述了幾種獲取密鑰所需部分的方法,上面使用key[-3]

有人要求同時獲取countsum ,可以在一個簡單的循環中實現並管理一個計數器,但這是一種方法:

>>> from collections import deque
>>> {key: deque(enumerate(it.accumulate(item_dict[k] for k in g), 1), maxlen=1).pop()
...     for key, g in it.groupby(item_dict, lambda key: key[:-3])}
{'item_A_v': (1, 50), 'item_B_v': (1, 75), 'item_C_v': (2, 200)}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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