从Python 2.7中的数字列表中删除一组索引的最有效方法是什么?

Ste*_*ken 6 python indexing list

所以我想知道如何使用Python 2.7,最有效地获取用于表示这样的索引的值列表:(但长度最多为250,000+)

indices = [2, 4, 5]
Run Code Online (Sandbox Code Playgroud)

并从更大的列表中删除索引列表,如下所示:(3,000,000多项)

numbers = [2, 6, 12, 20, 24, 40, 42, 51]
Run Code Online (Sandbox Code Playgroud)

得到这样的结果:

[2, 6, 20, 42, 51]
Run Code Online (Sandbox Code Playgroud)

我正在寻找一种有效的解决方案.我知道有很多方法可以做到这一点,但这不是我的问题.效率是.此外,此操作必须多次完成,列表将以指数方式变小.我没有一个等式来表示它们随着时间的推移会变小多少.

编辑:

数字必须在整个时间内保持在列表中排序,或者在删除索引后返回到排序.名为indices的列表可以排序也可以不排序.它甚至不必在列表中.

Jon*_*nts 6

您可能需要考虑使用numpy库来提高效率(如果您处理整数列表可能不是一个坏主意):

>>> import numpy as np
>>> a = np.array([2, 6, 12, 20, 24, 40, 42, 51])
>>> np.delete(a, [2,4,5])
array([ 2,  6, 20, 42, 51])
Run Code Online (Sandbox Code Playgroud)

备注np.delete:http://docs.scipy.org/doc/numpy/reference/generated/numpy.delete.html

考虑保持主阵列不变也是值得的,但是维护一个蒙面阵列(虽然没有对它进行过任何速度测试......)


Joh*_*ooy 5

我怀疑在索引之间取整个切片可能比列表理解更快

def remove_indices(numbers, indices):
    result = []
    i=0
    for j in sorted(indices):
        result += numbers[i:j]
        i = j+1
    result += numbers[i:]
    return result
Run Code Online (Sandbox Code Playgroud)

  • @StevenHicken,如果索引总是已经排序,你不需要`sorted()`.尽管因为timsort在预先排序的列表中是线性的,但是留下它并不会有太大的影响. (2认同)