我在这里有两个问题,首先,按照我尝试的方法,我的错误在哪里?
第二,这是最好的方法吗(我希望使用列表理解来提供一种更简洁的方法,但是由于嵌套,我无法弄清楚它)。
因此,本质上,下面的函数比较2个列表,它们的大小可能不相同(new_order_books通常较小)。
我想做的是有效地加入两个列表,但是新旧_order_books的结构如下:
order_books-> order_book->订单->订单(order.market_id,order.size_matched,order.cancelled,order ...)
我无法更改接收数据的方式,所有新订单都是通过new_order_book发出的(old_order_book应该保持不变)。
但是,当我尝试简单的扩展时,因为两个order_books可能都具有来自同一市场的订单(order_book),这意味着我最终会重复(例如,当我尝试old_order_books.extend( new_order_books),然后我会看到所有旧订单x 2加上2个新订单。
因此,我想删除old_order_books中的market_id与new_order_books中的order_book中的market_id相同的所有order_book(每个order_book是一个单独的market_id)。
然后我的计划是删除该order_book,将较新的版本从new_order_books插入old_order_books,并将其作为具有所有最新订单的更新版本返回。
但是这似乎不起作用,我仍然可以得到重复的副本,因此,当我删除循环中的order_book时,当我查看循环之外的列表时,似乎没有发生任何变化。
最后一步是一次,我已经从特定的order_book中删除了订单,以完全删除该order_book,但是鉴于订单似乎并未删除,该步骤目前是多余的。
希望这已经足够清楚地解释了,但是我会尽力弄清楚。
我也怀疑,有一种更好的方法可以尝试这种方法,但是我无法弄清楚逻辑,因此请随意提出计划B,而不是这种方法!
为避免疑问(可能不相关),order_book,order等是自定义类,因此语法order.market_id等是正确的。
def compare_current_orders(old_order_books, new_order_books):
temp_old_market_id_list = []
for order_book in old_order_books:
for order in order_book.orders:
temp_old_market_id_list.append(order.market_id)
temp_new_market_id_list = []
for order_book in new_order_books:
for order in order_book.orders:
temp_new_market_id_list.append(order.market_id)
market_id_list = set(temp_new_market_id_list).intersection(temp_new_market_id_list)
for order_book in old_order_books:
for order in order_book.orders:
if order.market_id in market_id_list:
del order
break
for order_book in old_order_books:
for order in order_book.orders:
print(order.size_remaining, order.size_cancelled)
old_order_books2 = list(filter(None, old_order_books))
old_order_books2.extend(new_order_books)
return old_order_books2
答案 0 :(得分:0)
您的“已清除”列表与原始列表相同,因为您没有更改主列表的代码。您似乎希望这能完成这项工作。
for order_book in old_order_books:
for order in order_book.orders:
if order.market_id in market_id_list:
del order
break
order
是一个局部变量,它遍历order_book
中的顺序;它不链接到order_book
。您的命令del order
非常明确地不会影响order_book
;它所做的只是销毁变量order
。
我建议您通读有关过滤序列的教程,包括列表推导。您可以使用类似的
来创建符合您的规格的新列表new_list = [order for order in order_book.orders
if order.market_id not in market_id_list]
这将返回您想要保留的项目列表。