繁体   English   中英

Python,通过匹配键值求和字典列表

[英]Python, SUM list of dictionaries by matching key value

我找到了与我想做的类似的解决方案,并且在一定程度上有效。 但是不完全符合我的需要。 感谢您的帮助。

问题:我想为每个 OrderID 及其 TradeVolume 创建一个新列表/字典。 您可以有多个交易,但只有一个 OrderID。 如果一个 OrderID 有多个与之关联的交易,我想对 TradeVolume 求和。

我有一个从 JSON 响应中创建的唯一 orderID 列表:

order_ids = [39663397, 39982478]

修剪用于示例目的。
这是我将要运行的 JSON

   trades = [{'TradeNumber': 39784054, 'OrderNumber': 39982478, 'TradeVolume': 1.0}, {'TradeNumber': 39784055, 'OrderNumber': 39982478, 'TradeVolume': 1.0}]

预期结果:

{'OrderNumber': 39982478, 'TotalTradeVolume': 2.0}

当前 output:

{'OrderNumber': 39982478, 'TotalTradeVolume': 1.0}, 
{'OrderNumber': 39982478, 'TotalTradeVolume': 2.0}

如您所见,在第一次通过时,它按预期添加了它。 但是在第二次通过时,我希望它更新列表中已经存在的值,而不是添加新值。 第二项的总和是正确的。

这是我完成工作的代码片段:

for orderid in order_ids:
sum = 0
for trade in trades:
    if orderid == trade['OrderNumber']:
        sum = sum + trade['TradeVolume']

        if orderid not in total_per_order:
            print('not in,  adding...')
            total_per_order.append({'OrderNumber': orderid, 'TotalTradeVolume': sum})
        else:
            print('already here, updating...')
            total_per_order.update({'TotalTradeVolume': sum})

在调试模式下运行它,似乎永远不会发现 OrderNumber 已经在我创建的新列表中。 很确定这是我的错误所在。

谢谢你的帮助!

这个怎么样:

total_per_order = []
for orderid in order_ids:
    total_per_order.append({
        'OrderNumber': orderid,
        'TotalTradeVolume': sum(t['TradeVolume'] for t in trades if t['OrderNumber'] == orderid)}

结果; total_per_order = :

[{'OrderNumber': 39663397, 'TotalTradeVolume': 0},
 {'OrderNumber': 39982478, 'TotalTradeVolume': 2.0}]

为了解决您的预期结果,您还可以将代码底部的 if 语句提升到更高的级别:

total_per_order = []
for orderid in order_ids:
    sum = 0
    for trade in trades:
        if orderid == trade['OrderNumber']:
            sum = sum + trade['TradeVolume']

if orderid not in total_per_order:
    print('not in,  adding...')
    total_per_order.append({'OrderNumber': orderid, 'TotalTradeVolume': sum})
else:
    print('already here, updating...')
    total_per_order.update({'TotalTradeVolume': sum})

结果:

not in,  adding...
[{'OrderNumber': 39982478, 'TotalTradeVolume': 2.0}]

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM