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