因此,我想知道如何使用Python 2.7最有效地获取用于表示索引的值列表,如下所示:(但长度最多为250,000+)
indices = [2, 4, 5]
并从一个更大的列表中删除该索引列表,如下所示:(3,000,000+项)
numbers = [2, 6, 12, 20, 24, 40, 42, 51]
得到这样的结果:
[2, 6, 20, 42, 51]
我正在寻找一个有效的解决方案比什么都重要。我知道有很多方法可以做到这一点,但这不是我的问题。效率是。此外,这个操作将不得不做很多次,列表都将得到指数级的小。我没有一个方程来表示随着时间的推移,他们会得到多少小。
编辑:
数字必须在整个列表中保持排序,或者在索引被移除后恢复排序。索引列表可以是排序的,也可以不排序。它甚至不必在列表中。
6条答案
按热度按时间vsaztqbk1#
为了提高效率,您可能需要考虑使用numpy库(如果您要处理整数列表,这可能不是一个坏主意):
关于
np.delete
:http://docs.scipy.org/doc/numpy/reference/generated/numpy.delete.html保持主数组不变,但维护一个掩码数组(虽然还没有做过任何速度测试……)也是值得考虑的。
9o685dep2#
我怀疑在索引之间取整片可能比列表理解更快
zpqajqem3#
另一个选择:
编辑:
因此,在这个答案完全错误之后,我对每种不同的方法进行了基准测试:
水平轴是项目的数量,垂直轴是以秒为单位的时间。
最快的选择是使用切片来构建一个新列表(来自@gnibbler):
令人惊讶的是,它和“sets”(@Eric)击败了
numpy.delete
(@Jon Clements)这里是the script I used,也许我错过了什么。
brgchamk4#
这是我的第一个方法。
下面是一个测试模块,在您指定的条件下测试它。(300万个元素,需要删除250k)
在我的笔记本电脑上大约需要0.6秒。如果你要多次使用它,你可以考虑提前设置索引。
(FWIW布拉德利解决方案花的时间比我愿意等待的时间要长。)
编辑:这样稍微快一点:(0.55秒)
wztqucjr5#
不是那么有效率,而是一种不同的方法
jtjikinw6#
另一种不同的方法来实现这一点: