在Python中通过索引从列表中删除元素的简明方法

You*_*cha 5 python optimization

我有一个字符列表和索引列表

myList = ['a','b','c','d']
toRemove = [0,2]
Run Code Online (Sandbox Code Playgroud)

我想在一次手术中得到这个

myList = ['b','d']
Run Code Online (Sandbox Code Playgroud)

我能做到这一点,但有没有办法更快地做到这一点?

toRemove.reverse()
for i in toRemove:
    myList.pop(i)
Run Code Online (Sandbox Code Playgroud)

Nic*_*ood 5

简明扼要

>>> myList = ['a','b','c','d']
>>> toRemove = [0,2]
>>> 
>>> [v for i, v in enumerate(myList) if i not in toRemove]
['b', 'd']
>>> 
Run Code Online (Sandbox Code Playgroud)

  • 使`toRemove`成套,这实际上是一个非常好的算法.它是"O(m)"而不是"O(n*m)",其中`n = len(toRemove); m = len(myList)`因为它不会在每次删除项目时重复复制一半数组. (2认同)

MAK*_*MAK 5

您可以像其他答案所建议的那样使用列表理解,但为了使其真正更快,我建议您使用a set来删除您想要删除的索引.

>>> myList = ['a','b','c','d']
>>> toRemove = set([0,2])
>>> [x for i,x in enumerate(myList) if i not in toRemove]
['b', 'd']
Run Code Online (Sandbox Code Playgroud)

根据toRemove中的每个元素检查myList中的每个元素是O(n*m)(其中n是myList的长度,m是toRemove的长度).如果使用a set,则检查成员资格是O(1),因此整个过程变为O(n).但请记住,速度的差异是不明显的,除非去除真的很大(比如超过一千).


Aka*_*all 4

如果你愿意,你可以使用numpy.

import numpy as np

myList = ['a','b','c','d']
toRemove = [0,2]

new_list = np.delete(myList, toRemove)
Run Code Online (Sandbox Code Playgroud)

结果:

>>> new_list
array(['b', 'd'], 
      dtype='|S1')
Run Code Online (Sandbox Code Playgroud)

请注意,这new_list是一个numpy array.

  • 您不认为 N​​umpy 对于一个简单的“删除数组”问题有点大材小用吗? (2认同)