我的问题是我有一个清单 例如。
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
感谢您的回答。
答案 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]