【问题标题】:Nested List doesn't update after delete删除后嵌套列表不更新
【发布时间】: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 时自己发现问题。阅读链接并尽力而为,然后在您的问题中发布该代码。
  • 您的代码做错的一件事是修改(删除)列表中正在迭代的项目——这通常不起作用。您似乎也不了解提供说明和重现问题的示例代码的最小方面。

标签: python list loops nested


【解决方案1】:

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

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]

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

【讨论】:

  • 谢谢@Prune,这确实有道理,但你已经强调了我面临的问题并且无法解决。不幸的是,没有关于复杂列表推导的教程,我无法弄清楚语法。从本质上讲,您的解决方案是一个级别的短。由于 order_book.orders 在 order_books 对象中,所以我也需要遍历它,我无法弄清楚如何在列表理解中进行另一个级别的迭代!我明白你在删除点上的逻辑,所以我同意你的方法是有道理的,但它不会以目前的形式工作:-(
  • 是的,您仍然需要遍历 old_order_books,因为您要单独处理其中的每个元素。您不能用一行替换所有内容,因为您需要为每个 .orders 条目提供单独的结果。
  • 啊,谢谢,这就是我所缺少的,希望纯粹通过列表理解来实现,但我根本没有得到它。如果我需要遍历第一级,然后执行列表理解,我可以像这样重试。非常感谢!
猜你喜欢
  • 2012-09-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-08-21
  • 2016-02-01
  • 2022-12-12
  • 1970-01-01
相关资源
最近更新 更多