如何在Python中对dictlike结构中的耦合值求和?

2024-09-28 17:18:44 发布

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

我有一个正在解析的xlsx openpyxl。在

A列是产品名称,B列是revenue,我想将每对产品收入值提取到A dict。若并没有重复的产品,只需通过适当地映射ws.columns来创建dict。在

问题是,有些(但不是所有)产品都有多个条目。对于这些,我需要求和这些值的总和,然后返回这些产品的一个键(对于其他产品)。因此,如果我的收入电子表格包含以下内容:

{1美元^

在返回dict之前,我希望将香蕉的收入值相加。然后期望的结果是:

{'Banana': 7.2, 'Apple': 1.7, 'Pear': 6.2, 'Kiwi': 1.2}

如果没有重复项,则以下操作正常:

^{pr2}$

但很明显,当它遇到重复时就会崩溃。我可以尝试使用MultiDict(),它将给出一个结构,我可以从中执行加法并创建最后的dict

^{3}$

这就给我留下了一个MultiDict,它本身实际上是一个元组的列表,所有这些都变得有点复杂。有没有一种更简洁或标准的库方法来实现同一个键的多次数据结构?雇佣zip()怎么样?不一定要像口述一样。我只需要能够从中创建一个dict(然后执行加法)。在


Tags: columnsapplews产品条目xlsxdict电子表格
3条回答

假设第二列的length比第一列少;可以简单地按第一列中的值对行进行分组,然后将其余的行相加,如下所示:

from itertools import izip_longest, groupby
from operator import itemgetter

rows = izip_longest(ws.columns[0], ws.columns[1], fillvalue=0)

result = dict((k, sum((g[1] for g in v))) for k, v in groupby(rows, itemgetter(0)))

collections.defaultdict是为这种类型的用例而设计的。在

>>> 
>>> d = collections.defaultdict(float)
>>> p = [('Kiwi', 1.2), ('Banana', 3.2), ('Pear', 6.2), ('Banana', 2.3), ('Apple', 1.7), ('Banana', 1.7)]
>>> for k,v in p:
    d[k] += v


>>> d
defaultdict(<type 'float'>, {'Kiwi': 1.2, 'Pear': 6.2, 'Banana': 7.2, 'Apple': 1.7})
>>>

假设您可以将数据转换为键值元组的列表,这应该与您想要的结果接近:

list_key_value_tuples = [("A", 1), ("B", 2), ("A", 3)]

d = {}
for key, value in list_key_value_tuples:
    d[key] = d.get(key, 0) + value

> print d
{'A': 4, 'B': 2}

相关问题 更多 >