我是python的新手,我有很长的列表(列表中大约有100个元素)。我想添加此列表的每个第4个元素,并将结果存储为sum1
,sum2
,sum3
或sum4
。
我使用了以下代码:
while y in range(0,104):
if y%4==0:
sum=last_indexes[y]+sum
y=y+4
问题:
感谢您的时间和考虑
答案 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))
对于大型列表,这很快,因为:
答案 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
指定为我们想要的列表。然后,我们将sum1
,sum2
,sum3
和sum4
整数的值设为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