На основании вашего комментария
Важно "хранить элементы до тех пор, пока" условие не будет выполнено
Вы можете использовать itertools.takewhile
для этого.
takewhile (предикат, повторяемый) -> объект takewhile
Возвращать последовательные записи из итерируемого до тех пор, пока
предикат оценивается как истинное для каждой записи.
В этом решении, безусловно, есть возможности для совершенствования, но вы можете воспользоваться takewhile
class Grouper:
"""simple class to perform comparison when called, storing last element given"""
def __init__(self, diff):
self.last = None
self.diff = diff
def predicate(self, item):
if self.last is None:
return True
return abs(self.last - item) < self.diff
def __call__(self, item):
"""called with each item by takewhile"""
result = self.predicate(item)
self.last = item
return result
def group_by_difference(items, diff=3):
results = []
start = 0
remaining_items = items
while remaining_items:
g = Grouper(diff)
group = [*itertools.takewhile(g, remaining_items)]
results.append(group)
start += len(group)
remaining_items = items[start:]
return results
Это дает вам сгруппированные предметы с одноэлементными кластерами.
[[1],
[6],
[13, 15, 17, 18, 19, 21],
[29],
[36],
[53],
[58, 59, 61, 63],
[78, 79, 81],
[102],
[114]]