首页 > 解决方案 > 删除后嵌套列表不更新

问题描述

我在这里有两个问题,首先,我尝试过的方法,我的错误在哪里?

其次,这是最好的方法吗(我希望使用列表理解的更简洁的方法,但由于嵌套,我无法弄清楚)。

所以本质上,下面的函数比较了 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

标签: pythonlistloopsnested

解决方案


您的“清理”列表与原始列表相同,因为您没有更改主列表的代码。看来您希望这可以完成这项工作。

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]

这将返回您似乎想要保留的项目列表。


推荐阅读