如何在 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)))
我有一个正在使用 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)))