如何从列表中删除?

时间:2013-06-25 18:30:32

标签: python

假设我有以下列表:

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)

5 个答案:

答案 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)