Python3 del объект из списка - PullRequest
       1

Python3 del объект из списка

0 голосов
/ 15 октября 2018

Я пытаюсь удалить объект из моего списка внутри моего цикла, но он не работает.

data = []

data.append({
    'one': 1,
    'two': 2
})

data.append({
    'one': 3,
    'two': 4
})

data.append({
    'one': 5,
    'two': 6
})

for d in data:
    if d['one'] == 3:
        del d

Невозможно удалить мой объект таким образом?del d

Единственное решение, которое я нашел, это создать счетчик и затем удалить его с индексом в списке данных del data[x]

Ответы [ 3 ]

0 голосов
/ 15 октября 2018

del d отменяет привязку имени d, которое является просто еще одной ссылкой на один из словарей в data.Поскольку ссылки переназначаются и освобождаются независимо (см. classic ), вы не увидите никаких изменений в data.

В целом, подвержен ошибкам дляудаляйте элементы из списка, перебирая его.

Общепринятая мудрость, основанная на сотнях лет программирования Python, говорит, что нужно создать новый список и связать имя заново.

>>> data = [d for d in data if d['one'] != 3]
>>> data
[{'two': 2, 'one': 1}, {'two': 6, 'one': 5}]
0 голосов
/ 15 октября 2018

Вы не можете удалять элементы из списка во время итерации по нему, потому что индексы списка меняются при удалении элементов.Также del d просто удалил имя d, словарь все еще будет существовать в списке.

Лучшее решение здесь - создать новый список с отфильтрованными нежелательными элементами:

data = [d for d in data if d['one'] != 3]

Если важно изменить существующий список data, потому что есть другие ссылки на него, которые также должны видеть изменения, которые вы можете использовать для назначения фрагмента, чтобы обновить исходный список, но это обычно не требуется:

data[:] = [d for d in data if d['one'] != 3]
0 голосов
/ 15 октября 2018

Вы можете использовать фильтр :

data = filter(lambda x: x['one'] != 3, data)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...