3

我有一个像这样排成一行的数字列表:

0
1
0
2
0
4

它有大约数千行

我想每 3 行将它们加起来,所以结果将是这样的:

1
6

我已经用这一行将列表变成了单独的整数:

k = map(lambda s: s.strip(), k)
integer = map(int, k)

我怎么能做加法?

4

6 回答 6

4

使用 grouper,例如从Alternative way 将列表拆分为 n 组

import itertools

def grouper(n, iterable, fillvalue=None):
    "grouper(3, 'ABCDEFG', 'x') --> ABC DEF Gxx"
    args = [iter(iterable)] * n
    return itertools.izip_longest(*args, fillvalue=fillvalue)

map(sum, grouper(3, interger, 0))

注意上面的代码假设python 2.x;对于 3.x,您需要itertools.zip_longest改用。

演示:

>>> example = [0, 1, 0, 2, 0, 4]
>>> map(sum, grouper(3, example, 0))
[1, 6]
于 2012-07-31T10:56:33.720 回答
1

这可能是最 Pythonic 的:

>>> my_list = iter(my_list)
>>> map(sum, zip(my_list, my_list, my_list))
[1, 6]
于 2012-07-31T11:38:16.763 回答
1

既然你说你已经有一个数字列表,那么

result = [sum(data[i:i+3])for i in range(0, len(data),3)]

例如,

 data = range(1, 16) # [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16]

产量

 [6, 15, 24, 33, 42]
于 2012-07-31T11:01:31.630 回答
0

使用itertools grouper配方

>>> from itertools import izip_longest
>>> def grouper(n, iterable, fillvalue=None):
        "Collect data into fixed-length chunks or blocks"
        # grouper(3, 'ABCDEFG', 'x') --> ABC DEF Gxx
        args = [iter(iterable)] * n
        return izip_longest(fillvalue=fillvalue, *args)

>>> with open('data.txt') as fin:
        for g in grouper(3, fin):
            print sum(map(int, g))


1
6
于 2012-07-31T10:56:50.240 回答
0

这将跳过不适合三个一组的剩余数字:

>>> def sum_three(iterable_):
...     iterable_ = iter(iterable_)
...     while True:
...         yield next(iterable_) + next(iterable_) + next(iterable_)
...
>>> my_list = [0, 1, 0, 2, 0, 4, 99, 1]
>>> list(sum_three(my_list))
>>> [1, 6]
于 2012-07-31T11:32:13.267 回答
0

石斑鱼和所有花哨的东西都可以工作……但在这种情况下,简单的列表理解就可以了。它应该又好又快!:)

>>> q = range(9)
>>> q
[0, 1, 2, 3, 4, 5, 6, 7, 8]
>>> [sum(q[3*n:3*n+3]) for n in range(len(q)/3)]
[3, 12, 21]
于 2012-07-31T11:01:24.193 回答