如何在 Python 中对类似字典的结构中的耦合值求和?

How to sum coupled values in a dict-like structure in Python?

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

A 列是产品名称,B 列是收入,我想将每对产品收入值提取到一个 dict 中。如果没有重复的产品,只需通过适当映射 ws.columns 来创建字典即可。

问题是,某些(但不是全部)产品有多个条目。对于这些,我需要对有问题的值求和,并且只是 return 这些产品的一个键(对于其余产品)。因此,如果我的收入电子表格包含以下内容:

我想在return输入字典之前对Banana Revenue 的值 求和。那么期望的结果是:

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

如果没有重复,以下内容可以正常工作:

revenue{}
i = 0;
for product in ws.columns[0]:
    revenue[product.value] = ws.columns[1][i].value
    i+=1

但是显然遇到重复就崩溃了。我可以尝试使用 MultiDict(),它将提供一个结构,我可以从中执行加法并创建我的最终 dict:

d = MultiDict()
for i in range(len(ws.columns[1])):
        d.add(ws.columns[0][i].value,ws.columns[1][i].value)

这给我留下了一个 MultiDict,它本身实际上是一个 元组列表 ,而且它有点复杂。是否有更简洁或标准库的方法来实现多次使用同一键的数据结构?雇用 zip() 怎么样?不一定必须像 dict 一样。我只需要能够从中创建一个 dict(然后执行加法)。

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

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}

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})
>>>

假设第二列的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)))