从某个点增加列表中的数字

时间:2017-10-28 08:32:07

标签: python list slice

我有一个数字列表,例如[50,100,150,200,250]。我需要从指定的索引和指定的数量增加(或减少)每个数字。我能够通过两种方式做到这一点:

from itertools import islice

l = [50,100,150,200,250]
start_increment_index = 3

l[start_increment_index:] = [e+100 for e in l[start_increment_index:]]
print (l)

l = [50,100,150,200,250]

l[start_increment_index:] = [e+100 for e in islice(l,start_increment_index,len(l))]
print (l)

两者都打印:[50, 100, 150, 300, 350]

但是,我的真实列表包含数百万个数字,并且使用不同的索引和不同的增量/减量重复执行此操作。使用Python列表有更快的方法吗?我一直在考虑编写自己的C / C ++扩展来处理这个问题。

编辑:这对于Python来说一般来说是一个有用的模块吗?有一个用C编写的函数,它可以带参数(python_list_object, increment_amount, start_index, end_index)

2 个答案:

答案 0 :(得分:1)

具体取决于您的目标。我想你可以在这种情况下使用段树。有关详细信息,请参阅https://en.m.wikipedia.org/wiki/Segment_tree

仅供简要说明。此结构表示将在其上执行范围操作的数组(如带数字的加法/减法子数组)此结构针对您具有大量此类范围查询的情况进行了优化。

注意:如果你只想使用python列表结构,那么你可以实现稀疏表(它是段树的另一个视图,在数组中隐式存储树)

答案 1 :(得分:1)

您创建(分配内存+副本)两个列表的解决方案中的主要问题。首先是它自己的列表理解和其中的第二个l[start_increment_index:]

如果数据源是python列表,则可以对O(n)进行操作:

for i in range(start_increment_index, len(l)):
    l[i] += increment

注意:首先定义increment