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] |
另一个答案提到了代码的错误。但请注意,在这些情况下使用列表解析总是更容易。
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] |
这是使用
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] |
或者,您可以使用
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] |