关于python:我需要创建一个列表,其中包含一次三个列表的所有总和,即添加前3个元素然后接下来的3个元素

I need to create a list containing all the sums of a list taken three at a time, ie, add first 3 elements then the next 3

本问题已经有最佳答案,请猛点这里访问。

我需要添加列表的前三个元素,然后添加列表的后三个元素,依此类推。 这是我到目前为止的代码:

1
2
3
4
5
6
7
8
def get_triple_sums_list(a_list):
    new_list = []
    for numbers in range(0,len(a_list)):
        numbers = sum(a_list[:3])
        new_list.append(numbers)
        return new_list
    if a_list == []:
        return []

对于列表:

1
 [1, 5, 3, 4, 5, 2]

这反过来给了我结果:

1
[9]

我需要得到

1
[9, 11]

如果剩下的数字小于3,它给我剩余的总和,即,

1
[1, 6, 2, 4, 3]

给我

1
[9, 7]

1
[1, 6, 2, 4]

给我吗

1
[9, 4]

我们来分析你的代码吧!

1
2
3
4
5
6
7
8
9
10
11
def get_triple_sums_list(a_list):
    new_list = []
    for numbers in range(0,len(a_list)):
        numbers = sum(a_list[:3]) #You should be using the variable
                                  #numbers here somehow.
       #^^^^^^^ - You are overwriting the for-loop index.
        new_list.append(numbers)
        return new_list  #Why are you returning here? You should be
                         #appending to `new_list`.
    if a_list == []:
        return []

这是固定代码:

1
2
3
4
5
6
7
def get_triple_sums_list(a_list):
    new_list = []
    for index in range(0,len(a_list), 3): #Range takes a 3rd param!
        total = sum(a_list[index:index+3])#Get all the elements from the
                                          #index to index+3
        new_list.append(total)
    return new_list

更新:似乎正在进行缩短比赛 - 我不想被抛在后面。这是一个我想添加到列表中的丑陋版本。

1
2
3
4
>>> a = [1,2,3,4,5,6,7,8]
>>> a += [0]*(len(a)%3) #For people who are too lazy to import izip_longest
>>> map(sum,zip(a[::3], a[1::3], a[2::3]))
[6, 15, 15]

我喜欢SuperSaiyan解释事物的方法,我会成为缩短它的人。您可以通过单一理解获得相同的结果:

1
2
3
4
5
6
l = [1, 5, 3, 4, 5, 2]
n = 3    
r = [sum(l[i:i+n]) for i in range(0, len(l), n)]

print(r)
[9, 11]

l[i:i+n]将列表分成长度为3的偶数块,sum负责将这些列表加在一起。使用for i in range(0, len(l), n),我们指示此操作将发生ceil(len(l) / 3)次。


另一个答案提到了代码的错误。但请注意,在这些情况下使用列表解析总是更容易。

1
2
3
>>> l =  [1, 5, 3, 4, 5, 2]
>>> [sum(l[i:i+3]) for i in range(0,len(l),3)]
[9, 11]

它也适用于un-mod-3列表

1
2
3
>>> l =  [1, 5, 3, 4, 5]
>>> [sum(l[i:i+3]) for i in range(0,len(l),3)]
[9, 9]

请参阅"列表理解"是什么意思?它是如何工作的,我该如何使用它?有关列表理解的更多详细信息。


只是因为我喜欢与众不同。

1
2
3
4
5
l = [1, 5, 3, 4, 5, 3, 42]
g = lambda l,s: [sum(l[i:i+s]) for i in range(0,len(l),s)]
print g(l,3)

#>> [9,12,42]


这是使用itertools(python2中的izip_longest)中的zip_longest进行稍微不同的方式,它将列表拆分为三个列表然后压缩它们以获取三个元素的包,最后对包进行求和:

1
2
3
4
5
from itertools import zip_longest
a=[1, 6, 2, 4, 3]
b=zip_longest(a[0::3],a[1::3],a[2::3],fillvalue=0)
result=[sum(x) for x in b]
>>>[9, 7]

或者,您可以使用map()lambda函数来实现它:

1
2
3
>>> my_list = [1, 5, 3, 4, 5, 2]
>>> list(map(lambda x: sum(my_list[x:x+3]), range(0, len(my_list), 3)))
[9, 11]