[英]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]
。
有人要求同時獲取count
和sum
,可以在一個簡單的循環中實現並管理一個計數器,但這是一種方法:
>>> 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.