我面临一个有点令人不安的问题:我有一个列表(例如(2, 5, 7, 3, 8)
),我需要删除其中的几个但不是全部。假设我需要删除索引1
,3
和4
,我想在循环中执行此操作。无论如何(在Python或逻辑上)都可以在循环中轻松删除这些索引。
如果我有一个列表remIndexes = (1, 3, 4)
,一旦删除索引1
,一切都向下移动一个,所以现在我有(2, 7, 3, 8)
和我要删除的数字的索引向下移动一个。
python是否提供了一种巧妙的方法,或者我是否必须订购列表remIndexes
,然后返回列表?
注意:remIndexes应该是有序的,但它可能不是有序的。但是,订购并不是很难。
更新:
为什么
lst = [1, 2, 3, 4, 5, 6, 7, 8, 9, 0]
for ind, num in enumerate(lst):
print lst.pop(ind)
实际上工作????? (它在换行符上打印2 4 6 8 0
。)
python是否在for循环中冻结列表?
答案 0 :(得分:1)
迭代反向索引:
>>> lst = [2, 5, 7, 3, 8]
>>> indexes = 1, 3, 4
>>> for i in reversed(indexes):
... del lst[i]
...
>>> lst
[2, 7]
如果索引未排序,则使用sorted(indexes, reverse=True)
。
将list comprehension与enumerate
一起使用:
>>> lst = [2, 5, 7, 3, 8]
>>> indexes = 1, 3, 4
>>> indexes = set(indexes) # `x in set` is faster than `x in tuple/list`
>>> [x for i, x in enumerate(lst) if i not in indexes]
[2, 7]