汇总列表中的项目组

时间:2015-10-10 10:17:28

标签: python

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]

5 个答案:

答案 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]