Мой вопрос не является дубликатом «Удалить элементы из нескольких списков одновременно», поскольку лучшее решение связанного вопроса использует цикл 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
Как удалить несколько элементов из списка списков, сохраняя при этом синхронизацию списков в Python ⇐ Python
Программы на Python
1731254998
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"][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)
Это работает, но полученное значение 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],
}
Подробнее здесь: [url]https://stackoverflow.com/questions/79175107/how-to-remove-multiple-items-from-a-dict-of-lists-while-keeping-the-lists-in-syn[/url]
Ответить
1 сообщение
• Страница 1 из 1
Перейти
- Кемерово-IT
- ↳ Javascript
- ↳ C#
- ↳ JAVA
- ↳ Elasticsearch aggregation
- ↳ Python
- ↳ Php
- ↳ Android
- ↳ Html
- ↳ Jquery
- ↳ C++
- ↳ IOS
- ↳ CSS
- ↳ Excel
- ↳ Linux
- ↳ Apache
- ↳ MySql
- Детский мир
- Для души
- ↳ Музыкальные инструменты даром
- ↳ Печатная продукция даром
- Внешняя красота и здоровье
- ↳ Одежда и обувь для взрослых даром
- ↳ Товары для здоровья
- ↳ Физкультура и спорт
- Техника - даром!
- ↳ Автомобилистам
- ↳ Компьютерная техника
- ↳ Плиты: газовые и электрические
- ↳ Холодильники
- ↳ Стиральные машины
- ↳ Телевизоры
- ↳ Телефоны, смартфоны, плашеты
- ↳ Швейные машинки
- ↳ Прочая электроника и техника
- ↳ Фототехника
- Ремонт и интерьер
- ↳ Стройматериалы, инструмент
- ↳ Мебель и предметы интерьера даром
- ↳ Cантехника
- Другие темы
- ↳ Разное даром
- ↳ Давай меняться!
- ↳ Отдам\возьму за копеечку
- ↳ Работа и подработка в Кемерове
- ↳ Давай с тобой поговорим...
Мобильная версия