@Kerm

Как исправить ошибку dictionary changed size during iteration?

Мой код, вызывающий ошибку:

for product_id, values in products.items():
            if values['g_1'] == 0:
                del products[product_id]


Ключами в словаре являются ID товаров, у каждого товара есть свои параметры, и если один из этих параметров равен 0, надо его удалить из словаря по ключу, не могу самостоятельно обойти ошибку эту.
  • Вопрос задан
  • 71 просмотр
Решения вопроса 2
Andrew_Pinkerton
@Andrew_Pinkerton
products = {
    '00000234': {'value1': 0, 'value2': 23},
    '567333': {'value1': 5, 'value2': 23},
    '23234243': {'value1': 25, 'value2': 23},
}
products = {product_id: values for product_id, values in products.items() if values['value1']}
print(products)
# {'567333': {'value1': 5, 'value2': 23}, '23234243': {'value1': 25, 'value2': 23}}


Или

spoiler
Создай еще один словарь, проверяй условие в цикле
если проходит по твоим параметрам (что нет параметров равных 0) добавляй в новый словарь,
по окончании цикла возвращай новый словарь
Ответ написан
trapwalker
@trapwalker
Программист, энтузиаст
Проблема связана с тем, что вы пытаетесь модифицировать словарь, по элементам которого итерируетесь.
В условиях вашего кода это не проблема. Но вы должны сначала прежде чем начнётся цикл с удалениями) взять список пар элементов из вашего словаря.
products.items() возвращает не список, а итератор по элементам словаря. Само собой этот итератор ломается как только вы удаляете из словаря первый элемент.
Но если этот итератор до первого удаления полностью превратить в список, то удалять потом можно что хотите.
for product_id, value in list(products.items()):
    if value['g_1'] == 0:
        del products[product_id]

Или так:
new_products_dict = {k: v for k, v in products.items() if v['g_1'] != 0}

Здесь создаётся новый словарь из элементов, которые удовлетворяют вашим условиям.
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы