在Python中,已知多个列表元素的索引,如何删除它们?

3

当只知道列表项的索引时,最好和最符合Python风格的方法是什么,用于从列表中删除项目?

my_list = ['zero', 'one', 'two', 'three', 'four']
my_removal_indices = [0, 2, 4]
# what to do
my_list = ['one', 'three']

请注意,类似以下的内容:
my_list = [item for item in my_list if my_list.index(item) in my_removal_indices]

不起作用,因为my_list中的元素可能不唯一。 当仅进行迭代时,my_list的索引会发生变化。 是否有比创建一个新的空列表,并将所有所需项存储在其中,然后将其设置为my_list之后更好的方法?

谢谢!


使用enumerate的答案可能是您想要的。但是,由于您说过“是否有比创建一个新的空列表并将所有所需项目存储在其中,然后将其设置为mylist更好的方法”,那么这本质上就是这些答案正在做的事情。根据您的用例,我怀疑这不是必要的,但您可以使用链接列表而不是常规列表来避免重新创建整个列表。 - Dan
3个回答

7
你可以使用enumerate来遍历列表并获取对应的索引值,然后检查这些索引是否在你要移除的列表中。
>>> [val for idx, val in enumerate(my_list) if idx not in my_removal_indices]
['one', 'three']

如果索引列表很长,为了提高性能,还可以切换到set来加速in检查。
my_removal_indices = {0, 2, 4}
>>> [val for idx, val in enumerate(my_list) if idx not in my_removal_indices]
['one', 'three']

0
如果你想要在原地进行操作而不是使用列表推导式创建一个新的列表,你可以通过删除元素来改变列表,只要你从列表的末尾开始操作:
my_list = ['zero', 'one', 'two', 'three', 'four']

my_removal_indices = [0, 2, 4]

for i in sorted(my_removal_indices,reverse=True):
    del my_list[i]

print(my_list)
# ['one', 'three']

0

试试这个,

my_list = ['zero', 'one', 'two', 'three', 'four']
my_removal_indices = [0, 2, 4]
print([my_list[i] for i in range(len(my_list)) if i not in my_removal_indices])


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接