在Python中计算列表子集的和

12 投票
3 回答
37009 浏览
提问于 2025-04-16 18:22

这可能很简单,我可能忽略了什么……

我有一长串整数,这些数字代表了某个网站每天的访客数量。我想要一个新的列表,显示每周的访客总数。所以我需要从原来的列表中每七个数字分成一组,把它们加起来,然后放到一个新列表里。

我现在的解决方案看起来有点笨拙,不太优雅:

numweeks = len(daily) / 7
weekly = []
for x in range(numweeks):
    y = x*7
    weekly.append(sum(visitors[y:y+7]))

有没有更高效或者更符合Python风格的方法来做到这一点呢?

3 个回答

0

使用 itertools.islice:

weekly = [sum(list(itertools.islice(daily, i, i+7)))
          for i in range(0, len(daily), 7)]

编辑:

或者,使用 math.fsum:

weekly = [math.fsum(itertools.islice(daily, i, i+7))
          for i in range(0, len(daily), 7)]
0
>>> daily = [1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20]
>>> print [sum(daily[x:x+7]) for x in range(0, len(daily), 7)]
[28, 77, 105]

我不太确定这算不算“符合Python风格”,但我真的很喜欢Python这种一行代码搞定的写法。

详细信息:列表推导式

15
weekly = [ sum(visitors[x:x+7]) for x in range(0, len(daily), 7)]

或者稍微简单一点:

weekly = []
for x in range(0, len(daily), 7):
     weekly.append( sum(visitors[x:x+7]) )

另外,你可以使用numpy模块。

by_week = numpy.reshape(visitors, (7, -1))
weekly = numpy.sum( by_week, axis = 1)

请注意,这个方法要求visitor中的元素数量必须是7的倍数。同时,你还需要安装numpy。不过,这个方法可能比其他方法更高效。

或者,如果你想要一些itertools的代码奖励:

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

weekly = map(sum, grouper(7, visitors, 0))

撰写回答