Я не знаю готового решения для этого, но написать его с нуля не так уж сложно.Выполните итерацию по элементам последовательности, проверяя каждую пару элементов на соответствие вашим критериям и выберите, добавлять ли ее в существующую группу или создать новую группу.
import collections
def pairs(seq):
"""yields (previous, current) pairs from the given iterable."""
no_item = object()
previous = no_item
for item in seq:
if previous is not no_item:
yield (previous, item)
previous = item
def chunk_contiguous(seq, criteria):
cur_group = []
for previous, current in pairs(seq):
if criteria(previous, current):
cur_group.append(current)
else:
yield cur_group
cur_group = [current]
if cur_group:
yield cur_group
Event = collections.namedtuple("Event", ["name", "timestamp"])
events = [
Event("foo", 0),
Event("bar", 1),
Event("baz", 10),
Event("qux", 12),
Event("Larry", 17),
Event("Curly", 21),
Event("Moe", 25),
]
g = 4
for group in chunk_contiguous(events, lambda previous, current: current.timestamp <= previous.timestamp + g):
print(group)
Результат:
[Event(name='bar', timestamp=1)]
[Event(name='baz', timestamp=10), Event(name='qux', timestamp=12)]
[Event(name='Larry', timestamp=17), Event(name='Curly', timestamp=21), Event(name='Moe', timestamp=25)]