Удалить элемент из списка в словаре

Я пытаюсь удалить элемент(ы) из списка, который находится в словаре:

data = {"akey": [{"name": "X", "members_id": ["1", "2"]}, {"name": "Y", "members_id": ["1", "3"]}], "bkey": [{"name": "Y", "members_id": ["2", "3"]}]}

print(data)

to_remove = "1"

for key in data:
    for record in data[key]:
        if to_remove in record["members_id"]:
            data[key].remove(record)

print(data)

Если to_remove находится в record["members_id"], соответствующий элемент в data[key] должен быть удален.

Другими словами, для приведенного выше примера я ожидаю:

{"akey": [], "bkey": [{"name": "Y", "members_id": ["2", "3"]}]}

... но я получаю

{'akey': [{'name': 'Y', 'members_id': ['1', '3']}], 'bkey': [{'name': 'Y', 'members_id': ['2', '3']}]}

Почему удаляется только первый элемент в списке?

Формы c голосовым вводом в React с помощью Speechly
Формы c голосовым вводом в React с помощью Speechly
Пытались ли вы когда-нибудь заполнить веб-форму в области электронной коммерции, которая требует много кликов и выбора? Вас попросят заполнить дату,...
Стилизация и валидация html-формы без использования JavaScript (только HTML/CSS)
Стилизация и валидация html-формы без использования JavaScript (только HTML/CSS)
Будучи разработчиком веб-приложений, легко впасть в заблуждение, считая, что приложение без JavaScript не имеет права на жизнь. Нам становится удобно...
Flatpickr: простой модуль календаря для вашего приложения на React
Flatpickr: простой модуль календаря для вашего приложения на React
Если вы ищете пакет для быстрой интеграции календаря с выбором даты в ваше приложения, то библиотека Flatpickr отлично справится с этой задачей....
В чем разница между Promise и Observable?
В чем разница между Promise и Observable?
Разберитесь в этом вопросе, и вы значительно повысите уровень своей компетенции.
Что такое cURL в PHP? Встроенные функции и пример GET запроса
Что такое cURL в PHP? Встроенные функции и пример GET запроса
Клиент для URL-адресов, cURL, позволяет взаимодействовать с множеством различных серверов по множеству различных протоколов с синтаксисом URL.
Четыре эффективных способа центрирования блочных элементов в CSS
Четыре эффективных способа центрирования блочных элементов в CSS
У каждого из нас бывали случаи, когда нам нужно отцентрировать блочный элемент, но мы не знаем, как это сделать. Даже если мы реализуем какой-то...
0
0
32
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Ответ принят как подходящий

Когда вы выполняете итерацию напрямую по списку for record in data[key], вы удаляете один из элементов во время итерации, который пропускает следующий, поскольку итерация поддерживается индексами, когда вы ничего не удаляете, все после этого перемещаются вперед один раз.

Итерация по копии списка:

for key in data:
    for record in list(data[key]):
        if to_remove in record["members_id"]:
            data[key].remove(record)

Или оставьте действительные и переназначьте их

for key in data:
    data[key] = [x for x in data[key] if to_remove not in x["members_id"]]

Вам необходимо учитывать возможность того, что значение удалять может отсутствовать в списке, который вы пытаетесь изменить. Поэтому:

data = {"akey": [{"name": "X", "members_id": ["1", "2"]}, {"name": "Y", "members_id": ["1", "3"]}], "bkey": [{"name": "Y", "members_id": ["2", "3"]}]}
to_remove = '1'

for d in data['akey']:
    try:
        if isinstance(d, dict):
            d['members_id'].remove(to_remove)
    except (KeyError, ValueError):
        pass

print(data)

Выход:

{'akey': [{'name': 'X', 'members_id': ['2']}, {'name': 'Y', 'members_id': ['3']}], 'bkey': [{'name': 'Y', 'members_id': ['2', '3']}]}

Примечание:

Обработчик исключений допускает возможность отсутствия словарного ключа 'members_id', а также отсутствия значения, указанного удалять.

Проблема в том, что вы пытаетесь удалить объекты внутри цикла. попробуй это

data = {"akey": [{"name": "X", "members_id": ["1", "2"]}, {"name": "Y", "members_id": ["1", "3"]}], "bkey": [{"name": "Y", "members_id": ["2", "3"]}]}

печать (данные)

to_remove = "1"

для ввода данных: я = 0

while i < len(data[key]):
    record = data[key][i]
    if to_remove in record["members_id"]:
        data[key].remove(record)
    else:
        i += 1

печать (данные)

Другие вопросы по теме