12

これはおそらく非常に単純で、私は何かを見落としています...

私は整数の長いリストを持っています。この場合、ウェブサイトへの毎日の訪問者を表しています。毎週の訪問者の新しいリストが欲しいです。したがって、元のリストから7つのグループを取得し、それらを合計して、新しいリストに追加する必要があります。

私の解決策はかなりブルートフォースでエレガントではないようです:

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

これを行うためのより効率的な、またはよりPython的な方法はありますか?

4

3 に答える 3

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))
于 2011-05-26T03:54:06.637 に答える
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」であるかどうかはわかりませんが、この1行のpythonが本当に気に入っています。

ゴーリーの詳細:理解

于 2011-05-26T04:08:18.500 に答える
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)]
于 2011-05-26T08:44:48.440 に答える