Как удалить несколько элементов из списка списков, сохраняя при этом синхронизацию списков в PythonPython

Программы на Python
Ответить Пред. темаСлед. тема
Anonymous
 Как удалить несколько элементов из списка списков, сохраняя при этом синхронизацию списков в Python

Сообщение Anonymous »

Мой вопрос не является дубликатом «Удалить элементы из нескольких списков одновременно», поскольку лучшее решение связанного вопроса использует цикл 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, а затем используйте add-pop, чтобы получить желаемое поведение, не мешая размещению элементов, пока я перемещаю закрытые транзакции
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"] == "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)


Это работает, но полученное значение close_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],
}


Подробнее здесь: https://stackoverflow.com/questions/791 ... sts-in-syn
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «Python»