读取并添加字典中相同键的值

2024-10-01 07:45:07 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在尝试添加相同键的字典的值。在下面的示例中,我去掉了每个键的版本编号,同时尝试添加“same”键的值。你知道吗

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_C_v" : 100,
"item_A_v" : 50,
"item_B_v" : 75

但当我试图脱光衣服的那一刻,似乎item_C_v已经读过一次了。如何使它读“两次”,以便获得200作为它的输出?你知道吗


Tags: 版本示例字典itemdict编号same我会
3条回答

可以使用^{}对结果进行分组,并将结果与键的所需部分相加,例如,可以使用正则表达式来获得所需部分。大致如下:

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}

您可以使用^{}以不同的方式提取键的所需部分:

>>> 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'

您可以使用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)}

您可以迭代原始字典并将新的键附加到新字典中,如果键已经存在,则将当前值添加到原始值中。你知道吗

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}

相关问题 更多 >