python - 从列表中删除不是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)
该函数应检查字典值是否在列表中,如果不在,则删除。然而,这个函数遗漏了一些元素(它不会删除所有你应该删除的元素)。任何想法?怎么了?
解决方案
正如@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
推荐阅读
- java - trustAnchors 参数必须为非空错误 | 摇篮 | 科尔多瓦
- html - 子元素的位置如何影响元素的 z-index
- python - Pandas read_csv 突然将 int 作为对象读取,我无法更改它
- excel - 当所需的匹配项嵌入到文本中时,从 VLOOKUP 返回结果
- java - javax.ejb.Remote 无法在 Spring Boot 中解决
- google-cloud-platform - Terraform:log export sink 在正常工作一段时间后抛出此错误“permission denied on bucket”
- ios - 将声明与 Swift 完成处理程序混淆
- php - 在 null 上调用成员函数 AddAddress()
- ios - 构建目标 MyNotificationService:找不到框架
- docker - 如何在 Docker 中更新网站?(本地)