在python中找到列表的子集总和

| 这可能很简单,我正在忽略某些东西... 我有一长串整数,在这种情况下,代表每日访问网站的人数。我想要一个每周访客的新清单。因此,我需要从原始列表中获取七个一组,将它们求和,然后将它们添加到新列表中。 我的解决方案似乎蛮力的,优雅的:
numweeks = len(daily) / 7
weekly = []
for x in range(numweeks):
    y = x*7
    weekly.append(sum(visitors[y:y+7]))
有没有更有效或更Pythony的方式来做到这一点?     
已邀请:
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))
    
>>> 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]
我不确定这是否是“ pythonic”,但是我真的很喜欢这行Python。 血腥细节:理解     
使用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)]
    

要回复问题请先登录注册