【发布时间】:2019-07-16 22:20:44
【问题描述】:
我在这里有两个问题,首先,对于我尝试过的方法,我的错误在哪里?
其次,这是最好的方法吗(我希望使用列表理解的方式更简洁,但由于嵌套,我无法弄清楚)。
所以本质上,下面的函数比较了 2 个列表,它们的大小可能不同(new_order_books 通常会更小)。
我想要做的是有效地加入两个列表,但是新旧_order_books的结构如下:
order_books -> order_book -> orders -> order (order.market_id, order.size_matched, order.cancelled, order....)
我无法更改接收数据的方式,所有新订单都来自 new_order_book(old_order_book 应该保持静态)。
但是,当我尝试简单的扩展时,因为两个 order_books 可能都有来自同一市场 (order_book) 的订单,这意味着我最终会得到重复的订单(假设有 2 个新订单进来,当我尝试 old_order_books.extend( new_order_books) 然后我会看到所有旧订单 x 2 加上 2 个新订单。
因此,我想删除 old_order_books 中的任何 order_book,其中 market_id 与 new_order_books 中的 order_book 中的 market_id 相同(每个 order_book 是一个单独的 market_id)。
我的计划是,在删除该 order_book 后,将新版本从 new_order_books 插入 old_order_books,并将其作为包含所有最新订单的更新版本返回。
但是这似乎不起作用,我仍然得到重复项,所以当我在循环内删除 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
【问题讨论】:
-
你显然无法复制问题@Prune,这段代码sn-p只是一个函数,但请让我知道哪个部分不清楚,我会尽力澄清,我确实尝试包括我能想到的所有内容,但如果不清楚,请道歉。
-
欢迎来到 StackOverflow。但是,您似乎并不了解该网站。如果您希望我们告诉您您的代码有什么问题,您需要给我们a Minimal, Complete, and Verifiable example。我们很乐意提供帮助,但出于其他原因,我们确实有一些要求,以使我们的工作更轻松。例如,您可能会在制作 MCVE 时自己发现问题。阅读链接并尽力而为,然后在您的问题中发布该代码。
-
您的代码做错的一件事是修改(删除)列表中正在迭代的项目——这通常不起作用。您似乎也不了解提供说明和重现问题的示例代码的最小方面。