簡體   English   中英

我如何像Python GROUP BY一樣基於python dict中的某些鍵組合值

[英]How can I combine values based on some key in python dict just like SQL GROUP BY

L = [{'id':1, 'quantity':1}, {'id':2, 'quantity':2}, {'id':1, 'quantity':3}]

我想基於id添加數量

因此,對於上面的列表,我希望輸出為:

 [{'id':1,'quantity':4},{'id':2,'quantity':2}]

另一個例子:

L = [{'id':1, 'quantity':1}, {'id':2, 'quantity':2}, {'id':1, 'quantity':2}, {'id':1, 'quantity':3}]

因此,對於上面的列表,我希望輸出為:

 [{'id':1, 'quantity':6}, {'id':2, 'quantity':2}]

python中, “分組依據”功能可以通過itertools.groupby()函數實現:

import itertools

l = [{'id':1, 'quantity':1}, {'id':2, 'quantity':2}, {'id':1, 'quantity':3}]
result = [ {'id': k, 'quantity': sum(_['quantity'] for _ in g)} 
            for k,g in itertools.groupby(sorted(l, key=lambda x:x['id']), key=lambda x:x['id'])]

print(result)

輸出:

[{'id': 1, 'quantity': 4}, {'id': 2, 'quantity': 2}]

這應該做您想要的:

from collections import defaultdict

def combine(items):
    counts = defaultdict(int)
    for d in items:
        counts[d["id"]] += d["quantity"]

    return [{"id": id, "quantity": q} for id, q in counts.items()]

例子:

>>> combine([{'id':1, 'quantity':1}, {'id':2, 'quantity':2}, {'id':1, 'quantity':3}])
[{'quantity': 4, 'id': 1}, {'quantity': 2, 'id': 2}]

>>> combine([{'id':1, 'quantity':1}, {'id':2, 'quantity':2}, {'id':1, 'quantity':2}, {'id':1, 'quantity':3}])
[{'quantity': 6, 'id': 1}, {'quantity': 2, 'id': 2}]

這與您將要獲得的一樣簡單和高效。

將其轉換為dataframe ,然后返回到dict

import pandas as pd
L = [{'id':1, 'quantity':1}, {'id':2, 'quantity':2}, {'id':1, 'quantity':3}]
output=pd.DataFrame(L).groupby('id')['quantity'].sum().to_dict()

假設輸入定義正確,這里我以一種直觀的方式實現了這一點:

output = {}
keys=[]
for e in L:
    if e['id'] not in keys:
        keys.append(e['id'])
        output[e['id']] = e['quantity']
    else:
        output[e['id']] += e['quantity']

[{'id':key,'identity':values} for key,values in  output.items()]

我實際上在想是否還有其他要求,例如,您需要更高的效率來執行大量數據? 如果是,則此方法似乎很乏味。

暫無
暫無

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

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