如何从列表字典中删除多个项目,同时在 Python 中保持列表同步

问题描述 投票:0回答:1

我的问题不是同时从多个列表中删除元素的重复,因为链接问题的最佳解决方案使用

for
循环来删除项目,同时迭代它,我已经在我的问题中提到过它不工作并且已经记录的行为。链接问题中接受的答案使用 numpy,这是一个额外的包,不需要它来执行基本任务,例如重新排列列表等数据结构


我有一个我维护的列表字典,其本质上就像电子表格行一样。列表中同一索引上的每个项目都属于同一记录。其用途是跟踪未完成的交易,并每隔一段时间删除已关闭的项目。

这是初始状态。

closed_pos = {
     "TransactionID": [],
     "Item":[],
     "BuyPrice":[],
     "SellPrice":[]
}

live_pos = {
    "TransactionID": [1, 2, 3, 4, 5],
    "Status": ["Open", "Closed", "Open", "Closed", "Closed"],
    "Item": ["ABC", "DEF", "GHI", "JKL", "MNO"],
    "BuyPrice": [5, 10, 15, 20, 5],
    "SellPrice": [None, 12, None, 25, 7],
}

现在我想移动定期关闭的交易。这样做的原因很简单。 live_pos 的访问更频繁,因此如果我可以减轻它的负载,就会很有帮助。 问题是我无法可靠地从我正在迭代的列表中删除项目,这是一个有据可查的行为。

一个可行的解决方案是我迭代列表并保留要删除的所有索引的单独列表。反转列表

indexes_to_remove
,然后使用追加弹出来获得所需的行为,而不会在移动
closed
交易时弄乱项目的位置

indexes_to_remove = []

for i in range(len(live_pos["TransactionID"])):
#Make a list of all indexes of lists to remove
    if live_pos["Status"][i] == "Closed":
        indexes_to_remove.append(i)

indexes_to_remove.reverse()
#Reverse the list so that you can use .pop() without problems.

for index in indexes_to_remove:
#remove items by index and feed them in closed_pos

        closed_pos["TransactionID"].append(live_pos["TransactionID"].pop(index))
        live_pos["Status"].pop(index) # No need to append `Status` to closed_pos. It is always going to be `Closed`
        closed_pos["Item"].append(live_pos["Item"].pop(index))
        closed_pos["BuyPrice"].append(live_pos["BuyPrice"].pop(index))
        closed_pos["SellPrice"].append(live_pos["SellPrice"].pop(index))

print(live_pos)
print(closed_pos)

这可行,但结果

closed_pos
也是相反的。结果不会按
2, 4, 5
的顺序排列,而是按
5, 4, 2
的顺序排列。

result_live_pos = {
    "TransactionID": [1, 3],
    "Status": ["Open", "Open"],
    "Item": ["ABC", "GHI"],
    "BuyPrice": [5, 15],
    "SellPrice": [None, None],
}


result_closed_pos = {
    "TransactionID": [5, 4, 2],
    "Item": ["MNO", "JKL", "DEF"],
    "BuyPrice": [5, 20, 10],
    "SellPrice": [7, 25, 12],
}

这就是我期待的结果

closed_pos = {
    "TradeID": [2, 4, 5],
    "Item": ["DEF", "JKL", "MNO"],
    "BuyPrice": [10, 20, 5],
    "SellPrice": [12, 25, 7],
}

live_pos = {
    "TradeID": [1, 3],
    "Status": ["Open", "Open"],
    "Item": ["ABC", "GHI"],
    "BuyPrice": [5, 15],
    "SellPrice": [None, None],
}
python
1个回答
0
投票

您只需使用

.insert(index of last item+1,data)
代替
.append(data)
:

indexes_to_remove = []

for i in range(len(live_pos["TransactionID"])):
#Make a list of all indexes of lists to remove
    if live_pos["Status"][i] == "Closed":
        indexes_to_remove.append(i)

indexes_to_remove.reverse()
#Reverse the list so that you can use .pop() without problems.

lastindex=len(closed_pos["Item"])
for index in indexes_to_remove:
#remove items by index and feed them in closed_pos
        closed_pos["TransactionID"].insert(lastindex,live_pos["TransactionID"].pop(index))
        live_pos["Status"].pop(index) # No need to append `Status` to closed_pos. It is always going to be `Closed`
        closed_pos["Item"].insert(lastindex,live_pos["Item"].pop(index))
        closed_pos["BuyPrice"].insert(lastindex,live_pos["BuyPrice"].pop(index))
        closed_pos["SellPrice"].insert(lastindex,live_pos["SellPrice"].pop(index))

print(live_pos)
print(closed_pos)
© www.soinside.com 2019 - 2024. All rights reserved.