总结列表中的每个备用4个元素

时间:2014-04-26 23:53:20

标签: python for-loop

我是python的新手,我有很长的列表(列表中大约有100个元素)。我想添加此列表的每个第4个元素,并将结果存储为sum1sum2sum3sum4。 我使用了以下代码:

while y in range(0,104):
    if y%4==0:
    sum=last_indexes[y]+sum
    y=y+4

问题:

  1. 如果列表增加,则编译时间会增加。在python中有什么功能可以用来加快这个过程吗?
  2. 此外,如果列表不是4的倍数,我仍然希望将它存储在sum1,sum2,sum3,sum4中,那么应该进行哪些修改。
  3. 感谢您的时间和考虑

6 个答案:

答案 0 :(得分:4)

不,如果输入较大,则无法以相同的速度运行代码(不编译)。

处理此问题的Pythonic方法越多,即使列表的长度不是4的倍数,也应该使用列表切片:

sum1 = sum(last_indices[::4])
sum2 = sum(last_indices[1::4])
sum3 = sum(last_indices[2::4])
sum4 = sum(last_indices[3::4])

a:b:c的切片表示法"从索引a开始,转到索引b,以c"为增量。省略a时,假定为0。省略b时,假定它是列表的末尾。

答案 1 :(得分:2)

要获得快速而干净的解决方案,请使用 itertools.islice() 以固定的时间间隔提取数据元素:

from itertools import islice

multiple = 4
for start in range(multiple):
    print sum(islice(data_array, start, None, multiple))

对于大型列表,这很快,因为:

  • 它没有进行昂贵的模数计算(islice有一个内部计数器)
  • 它不构建像常规切片那样的临时列表(islice使用迭代器)
  • sum() islice()以C速度运行(这是itertools模块的重点)

答案 2 :(得分:1)

任何时候你有一系列名为varX的变量,其中X是一个数字,你应该使用一个列表,而不是多个变量(非常少量的变量可能存在异常,像两个或三个)。在您的情况下,您应该使用包含四个整数的列表,而不是四个单独的sumX变量。作为附带好处,这将使您的代码变得非常简单!

sums = [0]*4                  # initialize list of sums
for i, v in enumerate(lst):   # iterate over indexes and values from the source list
    sums[i%4] += v            # add each value to the appropriate sum

答案 3 :(得分:0)

你可以和#34; for循环"为了那个原因。 For循环非常常用于列表管理。 解决问题的方法可能是这样的:

for i in range(len(your_list)-1):
    if i % 4 == 0:
        sum = your_list[i] + sum

答案 4 :(得分:0)

使用以下代码:

>>> lst = [5, 7, 3, 5, 4, 2, 7, 9, 5, 6, 1, 3, 2, 7, 5, 7, 5, 2, 9, 8, 9, 5, 3, 6, 2]
>>> len(lst)
25
>>> sum1 = sum2 = sum3 = sum4 = 0
>>> for k in range(len(lst)):
...     i = k % 4
...     j = lst[k]    
...     if i == 1:
...             sum1+=j
...     elif i == 2:
...             sum2+=j
...     elif i == 3:
...             sum3+=j
...     elif i == 0:
...             sum4+=j
... 
>>> sum1
29
>>> sum2
28
>>> sum3
38
>>> sum4
32
>>> 

注意:出于演示目的,我已将lst截断为25个长度

我们首先将lst指定为我们想要的列表。然后,我们将sum1sum2sum3sum4整数的值设为0.我们遍历列表的范围,并使用modulo,赋值{{ 1}}是i的剩余部分。

k/4

根据>>> 5 % 4 1 >>> 10 % 4 2 >>> 23 % 4 3 >>> 16 % 4 0 的值,我们将i添加到特定整数。然后我们打印出来。

答案 5 :(得分:0)

如果你想要快一个。这是我想的最快的方式。这会引发异常,但结果没有问题。如果您不想完成Exception,则可以在下面的测量代码中使用try...except myfunc块。

it = iter(data_array)
sum1 = 0
sum2 = 0
sum3 = 0
sum4 = 0
while(1):
    sum1 += it.next()
    sum2 += it.next()
    sum3 += it.next()
    sum4 += it.next()

测量代码:

#my answer
def myfunc(data_array):
    it = iter(data_array)
    sum1 = 0
    sum2 = 0
    sum3 = 0
    sum4 = 0
    while(1):
        try:
            sum1 += it.next()
            sum2 += it.next()
            sum3 += it.next()
            sum4 += it.next()
        except:
            break

#@Blckknght answer
def myfunc2(data_array):
    sums = [0]*4
    for i, v in enumerate(data_array):
        sums[i%4] += v

#@aj8uppal answer
def myfunc3(data_array):
    sum1 = 0
    sum2 = 0
    sum3 = 0
    sum4 = 0
    for k in range(len(data_array)):
        i = k % 4
        j = data_array[k]
        if i == 1:
                sum1+=j
        elif i == 2:
                sum2+=j
        elif i == 3:
                sum3+=j
        elif i == 0:
                sum4+=j

#@Raymond Hettinger answer
from itertools import islice
def myfunc4(data_array):
    sum1 = sum(islice(data_array, 0, None, 4))
    sum2 = sum(islice(data_array, 1, None, 4))
    sum3 = sum(islice(data_array, 2, None, 4))
    sum4 = sum(islice(data_array, 3, None, 4))

#@merlin2011 answer
def myfunc5(data_array):
    sum1 = sum(data_array[::4])
    sum2 = sum(data_array[1::4])
    sum3 = sum(data_array[2::4])
    sum4 = sum(data_array[3::4])

<强>测量

>>> data_array = range(100)

>>> %timeit myfunc(data_array)
100000 loops, best of 3: 12.5 us per loop

>>> %timeit myfunc2(data_array)
100000 loops, best of 3: 14.6 us per loop

>>> %timeit myfunc3(data_array)
100000 loops, best of 3: 16.7 us per loop

>>> %timeit myfunc4(data_array)
10000 loops, best of 3: 33.3 us per loop

>>> %timeit myfunc5(data_array)
10000 loops, best of 3: 56 us per loop