簡體   English   中英

如何在Python中以類似dict的結構求和耦合值?

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

我有一個用openpyxl解析的xlsx。

A列是產品名稱,B列是收入,我想將每對收益收入值提取到dict 如果沒有重復的產品,則只需通過適當地映射ws.columns創建一個字典ws.columns

問題是,某些(但不是全部)產品有多個條目。 對於這些,我需要對有問題的值求和,並只為這些產品返回一個鍵(其余為鍵)。 因此,如果我的收入電子表格包含以下內容:

在此處輸入圖片說明

我想在返回dict之前對香蕉的收入值求和 理想的結果是:

{'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 (然后執行添加)。

假設您可以將數據轉換為鍵值元組列表,則該值應該接近所需值:

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 小於第一列的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)))

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM