python - 删除后嵌套列表不更新
问题描述
我在这里有两个问题,首先,我尝试过的方法,我的错误在哪里?
其次,这是最好的方法吗(我希望使用列表理解的更简洁的方法,但由于嵌套,我无法弄清楚)。
所以本质上,下面的函数比较了 2 个列表,它们的大小可能不同(new_order_books 通常会更小)。
我想要做的是有效地加入 2 个列表,但是新旧 _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 时,当我查看循环外的列表时,似乎没有发生任何变化。
最后一步,曾经,我已经从一个特定的 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
解决方案
您的“清理”列表与原始列表相同,因为您没有更改主列表的代码。看来您希望这可以完成这项工作。
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]
这将返回您似乎想要保留的项目列表。
推荐阅读
- arrays - Chart.js - 访问 yAxes 属性
- amazon-web-services - 无法使用 Route 53 AWS 注册域
- python - TelegramBot,如何处理命令旁边的消息
- sql - 使用 REGEXP_LIKE 插入 Select 用于 10Mn+ 条运行缓慢的记录
- java - 创建父类的数组并向其添加子对象
- sympy - 在 sympy 中记录中介结果
- python - 如何导入和使用我的 python 包?
- c++ - 使用 Winsock 和 dirent 向客户端发送目录列表的问题
- machine-learning - 训练 YOLOv3 后缺课
- c++ - 用户输入的新 int