一次从列表中删除多个索引 - python

时间:2014-01-09 21:55:38

标签: python list python-3.x pop

我的问题是我有一个清单 例如。

lst = [2, 5, 7, 12, 13]


lst.pop(3) #12
lst.pop(4) #13

因为lst [3]已被删除,所以[4]不再存在(超出范围)。这给了我一个错误。现在我知道你可以说你的代码改为:...

lst.pop(4) #13
lst.pop(3) #12

...并且它修复了错误,但我的问题是我的实际代码是'弹出'随机数,所以它需要同时完成以避免错误。

有没有同时'弹出'的方法?...就像这样的东西:

lst.pop(3, 4) #12 and 13 at once

感谢您的回答。

5 个答案:

答案 0 :(得分:11)

您可以使用列表推导来重建列表:

indices = {3, 4}
newlist = [v for i, v in enumerate(oldlist) if i not in indices]

我在这里使用了一组索引,因为集合成员资格测试比列表更快。

请注意,删除(最好使用del lst[index])也会部分重建列表;在列表理解中使用一个循环这样做可以更有效。

演示:

>>> oldlist = [2, 5, 7, 12, 13]
>>> indices = {3, 4}
>>> [v for i, v in enumerate(oldlist) if i not in indices]
[2, 5, 7]

答案 1 :(得分:3)

您可以使用列表推导删除它们,这将创建一个新列表:

>>> lst = [2, 5, 7, 12, 13]
>>> [v for i, v in enumerate(lst) if i not in {4,3}]
[2, 5, 7]

您只需再次将此新列表分配给lst

答案 2 :(得分:0)

你可以使用numpy索引。

答案 3 :(得分:0)

如果确实希望通过就地删除来执行此操作,那么显而易见的答案是对要删除的索引进行排序:

>>> lst = [2, 5, 7, 12, 13]
>>> indices = {3, 4}
>>> for index in sorted(indices, reverse=True):
...     del lst[index]
>>> print(lst)
[2, 5, 7]

但请注意,这是Martijn列表理解的两倍。如果你试图以这种方式做事作为优化,(a)几乎肯定是过早的优化,(b)它很可能是悲观化。

如果您这样做是因为其他一些代码引用了lst,并且您需要它来查看更改,您仍然可以使用列表推导以及切片分配:

>>> lst[:] = [v for i, v in enumerate(lst) if i not in indices]

在这里,我们创建一个新列表,然后用新列表替换代表lst的整个内容的子片段。

答案 4 :(得分:0)

lst = [2, 5, 7, 12, 13]

indexes = [3, 4]
to_del = object()

for index in indexes:
    lst[index] = to_del

for _ in indexes:
    lst.remove(to_del)

print(lst)

[2, 5, 7]