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

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

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']}]}

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

Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
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

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

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