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

Python,通过匹配键值对字典列表求和,python,list,Python,List,我已经找到了类似的解决方案,这在一定程度上是可行的。然而,这并不完全符合我的需要。谢谢你的帮助 问题:我想根据OrderID及其交易量创建一个新列表/字典。您可以有多个交易,但只能有一个OrderID。如果OrderID有多个关联的交易,我想对交易量求和 我有一个从JSON响应生成的唯一OrderID列表: order_ids = [39663397, 39982478] 为便于示例而修剪。 下面是我将要运行的JSON trades = [{'TradeNumber': 39784054

我已经找到了类似的解决方案,这在一定程度上是可行的。然而,这并不完全符合我的需要。谢谢你的帮助

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

我有一个从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}
电流输出:

{'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)}
结果<代码>每个订单的总数量=:

[{'OrderNumber': 39663397, 'TotalTradeVolume': 0},
 {'OrderNumber': 39982478, 'TotalTradeVolume': 2.0}]
这个怎么样:

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)}
结果<代码>每个订单的总数量=:

[{'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}]

为了获得预期的结果,您还可以将代码底部的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}]

我想对于给定的示例,预期订单号应该是39663397,对吗?是的,所有这些都只是示例。让我更新一下以澄清。
trades
被定义为一个列表,因此每个字典都是该列表中一个独立的不相关项。如果您希望
trades
没有重复,那么它应该是一个字典,其中OrderNumber是不同的键,并且它有一个多个交易的列表(或者只是总数)
total\u per\u order
是您的字典列表,因此当然字符串
orderid
永远不会在该列表中。相反,您需要检查您的字典是否有特定的键值对:
如果有(当前dict[“OrderNumber”]==当前dict的orderid,按顺序总计):
是的,就是这样。我只是不知道正确的方法,然后去寻找键值对。我要试一试。谢谢你的帮助。我想对于给定的示例,预期的订单号应该是39663397,对吗?是的,所有的都只是示例。让我更新一下以澄清。
trades
被定义为一个列表,因此每个字典都是该列表中一个独立的不相关项。如果您希望
trades
没有重复,那么它应该是一个字典,其中OrderNumber是不同的键,并且它有一个多个交易的列表(或者只是总数)
total\u per\u order
是您的字典列表,因此当然字符串
orderid
永远不会在该列表中。相反,您需要检查您的字典是否有特定的键值对:
如果有(当前dict[“OrderNumber”]==当前dict的orderid,按顺序总计):
是的,就是这样。我只是不知道正确的方法,然后去寻找键值对。我要试一试。谢谢你的帮助。注意这里的else永远不会运行,正如paulm指出的,列表中没有键值对,因为我寻找它的方式是错误的。但您的解决方案仍然有效,因为我们移动了if。注意,else永远不会运行,正如Paul M指出的,列表中没有键值对,因为我寻找它的方式是错误的。但你的解决方案仍然有效,因为我们移动了if。