Один из способов - создать функцию генератора для группировки допусков. Эта функция предполагает, что список отсортирован, поэтому вам нужно передать отсортированный список или изменить его, чтобы выполнить сортировку в функции. Я уверен, что кто-то найдет способ сделать это с itertools.groupby
.
def groupby_tolerance(lst, tolerance):
result = [lst[0]]
for prev, curr in zip(lst, lst[1:]):
if curr[2] - prev[2] > tolerance:
yield result
result = []
result.append(curr)
yield result
Затем вызывается эта функция в вашем отсортированном списке (по 3-му пункту):
from operator import itemgetter
a = [[297, 151, 320], [293, 151, 305], [296, 151, 320], [295, 162, 306], [297, 160, 309], [300, 158, 321]]
grouped = groupby_tolerance(sorted(a, key=itemgetter(2)), 5)
, что дает группировку:
[[[293, 151, 305], [295, 162, 306], [297, 160, 309]], [[297, 151, 320], [296, 151, 320], [300, 158, 321]]]
Тогда вы можете застегните соответствующие элементы и вычислите среднее значение:
from statistics import mean
averages = [[mean(x) for x in zip(*group)] for group in grouped]
print(averages)
Средние значения:
[[295, 157.66666666666666, 306.6666666666667], [297.6666666666667, 153.33333333333334, 320.3333333333333]]