假设我有以下列表:
array1 = ['A', 'C', 'Desk']
和另一个包含以下内容的数组:
array2 = [{'id': 'A', 'name': 'Greg'},
{'id': 'Desk', 'name': 'Will'},
{'id': 'E', 'name': 'Craig'},
{'id': 'G', 'name': 'Johnson'}]
从列表中删除项目有什么好方法?以下似乎不起作用
for item in array2:
if item['id'] in array1:
array2.remove(item)
答案 0 :(得分:7)
你也可以使用列表理解:
>>> array2 = [{'id': 'A', 'name': 'Greg'},
... {'id': 'Desk', 'name': 'Will'},
... {'id': 'E', 'name': 'Craig'},
... {'id': 'G', 'name': 'Johnson'}]
>>> array1 = ['A', 'C', 'Desk']
>>> filtered = [item for item in array2 if item['id'] not in array1]
>>> filtered
[{'id': 'E', 'name': 'Craig'}, {'id': 'G', 'name': 'Johnson'}]
答案 1 :(得分:4)
您可以使用过滤器:
array2 = filter(lambda x: x['id'] not in array1, array2)
答案 2 :(得分:3)
您在迭代时修改列表。而是遍历列表的副本
for item in array2[:]: # [:] creates a copy
...
答案 3 :(得分:2)
for item in array2:
if item['id'] in array1:
array2.remove(item)
for
循环在迭代期间跟踪索引。
迭代1:索引0
item
被指定为{'id': 'A', 'name': 'Greg'}
,因为它位于索引0处。
在数组中找到'A'
,因此您从列表中删除了此条目。
由于删除了该项目,所以右边的所有项目实际上都将一个地方向左移动。
所以,现在{'id': 'Desk', 'name': 'Will'}
位于索引0。
迭代2:索引值更改为1
此时item
= {'id': 'E', 'name': 'Craig'}
,因为它位于索引1。
因此,您可以看到{'id': 'Desk', 'name': 'Will'}
已被跳过(从未分配给item
),并且不会按预期删除。
快速解决方案是使用列表的浅表副本进行迭代:
for item in array2[:]: #notice the [:]
答案 4 :(得分:0)
与Paulo的答案类似,但在过滤器中首先转换为set
:
array2[:] = filter(lambda L, S=set(array1): L['id'] not in S, array2)