首页 > 解决方案 > 从列表中删除不是python中字典项目值的项目

问题描述

成为以下元素列表:

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)

该函数应检查字典值是否在列表中,如果不在,则删除。然而,这个函数遗漏了一些元素(它不会删除所有你应该删除的元素)。任何想法?怎么了?

标签: pythonlistdictionary

解决方案


正如@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']并且我删除了 value '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

推荐阅读