在python中查找列表子集的和

2024-05-13 20:28:22 发布

您现在位置:Python中文网/ 问答频道 /正文

这可能很简单,我忽略了一些东西。。。

我有一个很长的整数列表,在本例中,它代表网站的每日访问者。我想要一份新的每周访客名单。所以我需要从原始列表中得到七个组,求和,然后将它们添加到一个新列表中。

我的解决方案看起来很残忍,不优雅:

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

有没有一种更有效,或更Python的方式来做这件事?


Tags: in列表forlen网站range代表整数
3条回答

使用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)]
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]

我不确定这是不是“Python”,但我真的很喜欢这一行的Python。

血淋淋的细节:Comprehensions

相关问题 更多 >