Для полноты, вот решение с itertools.groupby
, но словарное решение, вероятно, будет быстрее (не говоря уже о том, что его легче читать).
import itertools
import operator
def split_series(points, interval):
start = points[0][0]
return [[v for k, v in grouper] for group, grouper in
itertools.groupby((((n - start) // interval, val)
for n, val in points), operator.itemgetter(0))]
Обратите внимание, что в приведенном выше примере предполагается, что у вас есть хотя бы один элемент в каждой группе, в противном случае он даст другие результаты из вашего сценария, т.е.
>>> split_series([(1, 'a'), (2, 'b'), (6, 'a'), (6, 'd'), (11, 'c')], 3)
[['a', 'b'], ['a', 'd'], ['c']]
вместо
[['a', 'b'], ['a', 'd'], [], ['c']]
Вот исправленное словарное решение. В какой-то момент время поиска в словаре начнет доминировать, но, возможно, оно достаточно быстрое для вас, как это.
from collections import defaultdict
def split_series(points, interval):
offset = points[0][0]
maxval = (points[-1][0] - offset) // interval
vals = defaultdict(list)
for key, value in points:
vals[(key - offset) // interval].append(value)
return [vals[i] for i in xrange(maxval + 1)]