2

假设我有以下列表:

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)
4

5 回答 5

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'}]
于 2013-06-25T18:34:02.243 回答
4

您可以使用过滤器:

array2 = filter(lambda x: x['id'] not in array1, array2)
于 2013-06-25T18:38:21.963 回答
3

您在迭代列表时正在修改列表。而是遍历列表的副本

for item in array2[:]:  # [:] creates a copy
    ...
于 2013-06-25T18:32:55.400 回答
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 [:]
于 2013-06-25T18:46:01.273 回答
0

类似于保罗的回答,但set在过滤器中转换为第一个:

array2[:] = filter(lambda L, S=set(array1): L['id'] not in S, array2)
于 2013-06-25T18:59:13.053 回答