删除后嵌套列表不会更新

时间:2019-07-16 22:20:44

标签: python list loops nested

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

第二,这是最好的方法吗(我希望使用列表理解来提供一种更简洁的方法,但是由于嵌套,我无法弄清楚它)。

因此,本质上,下面的函数比较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应该保持不变)。

但是,当我尝试简单的扩展时,因为两个ord​​er_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

1 个答案:

答案 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]

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