Я пытаюсь удалить элемент(ы) из списка, который находится в словаре:
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']}]}
Почему удаляется только первый элемент в списке?
Когда вы выполняете итерацию напрямую по списку 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
печать (данные)