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

一次从列表中删除多个索引-python,python,python-3.x,list,Python,Python 3.x,List,我的问题是我有一张清单 例如 因为lst[3]已被删除,所以lst[4]不再存在(超出范围)。这给了我一个错误。现在我知道你可以说把你的代码改成: lst.pop(4) #13 lst.pop(3) #12 …它将修复错误,但我的问题是我的实际代码是“弹出”随机数,因此需要同时执行所有操作以避免错误 是否有任何同时“弹出”的方法?…类似于: lst.pop(3, 4) #12 and 13 at once 感谢您的回答。您可以使用列表理解来重建列表: indices = {3, 4} new

我的问题是我有一张清单 例如

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

lst.pop(4) #13
lst.pop(3) #12
…它将修复错误,但我的问题是我的实际代码是“弹出”随机数,因此需要同时执行所有操作以避免错误

是否有任何同时“弹出”的方法?…类似于:

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

感谢您的回答。

您可以使用列表理解来重建列表:

indices = {3, 4}
newlist = [v for i, v in enumerate(oldlist) if i not in indices]
我在这里使用了一个集合作为索引,因为集合成员测试比使用列表更快

请注意,删除(最好使用
dellst[index]
)也会部分重建列表;在列表理解中使用一个循环可以更有效地执行此操作

演示:


您可以通过列表理解删除它们,这将创建一个新列表:

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

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

您可以使用numpy索引进行此操作。

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

>>> 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
全部内容的子片。

我上面的示例是如何实现的?@DennisCallanan:正如我所发布的;我也给了你一个快速的演示课程。非常感谢!只是好奇,如果我有一个程序在循环中每秒运行很多次。这个方法会比从列表中“弹出”两个数字慢得多吗?@DennisCallanan:不要使用
.pop()
,除非你需要使用返回值;改用
dellstObject[index]
。它取决于列表对象的大小;如果要删除大列表中的低索引,则列表理解速度会更快。如果这是一段关键的代码,请使用
timeit
模块进行您自己的计时。我指的是
oldlist=index={3,4}
行,您可以在接下来的两行中重新定义这两个变量……不要将
list
用作变量名;您正在屏蔽内置类型。如果您想要一个安全的哨兵,您可以始终使用
来\u del=object()
。结果将永远不会与任何对象进行比较(或散列),除非它本身。如果您发布一个示例,它将更有用。
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]
>>> lst[:] = [v for i, v in enumerate(lst) if i not in indices]
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]