list1 = [1,3,5,7,9,11,13,15,17]
list2 = []
我想将前三个元素添加到list2[0]
,将后三个元素添加到list2[1]
,依此类推。
1+3+5 is list2[0]
7+9+11 is list2[1]
13+15+17 is list2[2]
结果应该是:
list2 = [9,27,45]
答案 0 :(得分:4)
标准itertools模块的文档具有将列表划分为固定长度组的方法:
def grouper(iterable, n, fillvalue=None):
"Collect data into fixed-length chunks or blocks"
# grouper('ABCDEFG', 3, 'x') --> ABC DEF Gxx"
args = [iter(iterable)] * n
return zip_longest(*args, fillvalue=fillvalue)
作为一个初学者,你可能不明白它是如何工作的,但我这样做是为了确认它是这样的:
import itertools as it
def grouper(iterable, n, fillvalue=None):
"Collect data into fixed-length chunks or blocks"
# grouper('ABCDEFG', 3, 'x') --> ABC DEF Gxx"
args = [iter(iterable)] * n
return it.zip_longest(*args, fillvalue=fillvalue)
list1 = [1,3,5,7,9,11,13,15,17]
print(list(grouper(list1, 3)))
打印:[(1, 3, 5), (7, 9, 11), (13, 15, 17)]
。所以你有三个项目的元组,现在你只需要添加它们,这就是内置sum
的用途:
list2 = [sum(group) for group in grouper(list1, 3)]
如果您的列表长度不能被3整除,则会出现这样的错误:
TypeError: unsupported operand type(s) for +: 'int' and 'NoneType'
可以通过以下两种方式之一修复:如果您想忽略奇数元素,请更改grouper
以调用当前调用zip
的{{1}};另一方面,如果您希望it.zip_longest
中的最后一个元素是奇数元素的总和,请使用0的填充值:
list2
答案 1 :(得分:3)
尝试
gr = [iter(list1)]*3
list2 = [sum(el) for el in zip(*gr)]
# or as an alternative
# list2 = list(map(sum, zip(*gr)))
print(list2)
产生
[9, 27, 45]
如果输入列表中的元素数是3的倍数,那么这是有效的。
如果你想让它适用于其他长度
from itertools import zip_longest
list1 = [1,3,5,7,9,11,13,15,17, 1,2]
gr=[iter(list1)]*3
list2 = [sum(el) for el in zip_longest(*gr, fillvalue=0)]
# or as an alternative
# list2 = list(map(sum, zip_longest(*gr, fillvalue=0)))
print(list2)
产生
[9, 27, 45, 3]
编辑:另一种解决方案是使用itertools.groupby
from itertools import groupby
g = groupby(enumerate(list1), lambda p, _: p//3)
list2 = [sum(v for p,v in t) for i, t in g]
print(list2)
适用于任何长度的列表(三个或三个的倍数)
答案 2 :(得分:2)
以下是其他几种方式。请注意(如在大多数已提交的答案中)我的前两种方法将忽略少于3项的部分组,但最后一种方法将处理此类部分组。
init
<强>输出强>
list1 = [1,3,5,7,9,11,13,15,17, 30, 40]
print list1
list2 = [sum(t) for t in zip(*[iter(list1)]*3)]
print list2
list2 = [i + j + k for i,j,k in zip(list1[0::3], list1[1::3], list1[2::3])]
print list2
list2 = []
s = 0
for i, v in enumerate(list1, 1):
s += v
if i % 3 == 0:
list2.append(s)
s = 0
if s:
list2.append(s)
print list2
答案 3 :(得分:1)
您需要做的就是将3 * i中的元素添加到3 *(i + 1) 我在哪里将是新list2的索引
>>> list1 = [1,3,5,7,9,11,13,15,17]
>>> list2=[]
>>> for i in range(len(list1)/3):
... list2.append(sum(list1[i*3:(i+1)*3]))
>>> list2
[9, 27, 45]
答案 4 :(得分:1)
list1 = [1,3,5,7,9,11,13,15,17]
# split list1 into 3 sublists
list2 = [list1[i:i + 3] for i in range(0, len(list1), 3)]
# map sum to sublists in list2
list2 = list(map(sum,list2))
print(list2)
[9, 27, 45]