Удалить элементы из списка, которые не являются значениями элементов словаря в python - PullRequest
0 голосов
/ 26 января 2020

Будет следующий список элементов:

list = ['aaa', 'xxx', 'bbb', 'ccc', 'xxx', 'bb']

также будет следующий словарь

dict = {111:'aaa', 222:'bbb', 333:'ccc', 444:'ddd'}

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

list_new = ['aaa', 'bbb', 'ccc']

Я сделал следующую функцию в python:

for keys, value in enumerate(list):
    if value not in dict.values():
        list.remove(value)

Функция должна проверить, если Значения словаря находятся в списке, если их нет, то удалите. Однако эта функция пропускает некоторые элементы (она не удаляет все, что вы должны удалить). Есть идеи? Что не так?

1 Ответ

1 голос
/ 26 января 2020

Как указывал @Jan, вы не должны изменять список во время итерации, так как это может вызвать нежелательное поведение. Вместо этого вы можете создать другой список с использованием списка:

my_list = ['aaa', 'xxx', 'bbb', 'ccc', 'xxx', 'bb']
my_dict = {111:'aaa', 222:'bbb', 333:'ccc', 444:'ddd'}
my_new_list = [value for value in my_list if value in my_dict.values()]

Чтобы выяснить, почему не следует изменять список во время его циклического просмотра: удаление значения из списка изменяет индекс всех следующих элементы. Например, если у меня есть список ['a', 'b', 'c', 'd', 'e'] и я удаляю значение 'c', у значений 'd' и 'e' их индексы будут вычтены на 1, поскольку список теперь будет ['a', 'b', 'd', 'e']. Проблема в том, что for перебирает список по их индексам, что может привести к пропуску значения 'd' из итерации. Пример кода:

>>> my_list = ['a', 'b', 'c', 'd', 'e']
>>> for value in my_list:
...     print(value)
...     if value == 'c':
...         my_list.remove(value)
...
a
b
c
e
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...