Модуль python itertools реализует некоторые базовые строительные блоки для итераторов. Как говорится, «они образуют итераторную алгебру». Я ожидал, но я не мог найти лаконичный способ сделать следующую итерацию с помощью модуля. Учитывая список упорядоченных действительных чисел, напримерИтерация над n последовательными элементами списка (с перекрытием)
a = [1.0,1.5,2.0,2.5,3.0]
... возвращает новый список (или просто итерацию) группировка по некоторым n
значение, скажем 2
b = [(1.0,1.5),(1.5,2.0),(2.0,2.5),(2.5,3.0)]
так, как я нашел делать это было следующим. Во-первых разделить список на две части, с эвенов и фор индексов:
even, odds = a[::2], a[1::2]
Затем построить новый список:
b = [(even, odd) for even, odd in zip(evens, odds)]
b = sorted(b + [(odd, even) for even, odd in zip(evens[1:], odds)])
В сущности, он похож на движущейся средней.
Есть ли лаконичный способ сделать это (с или без itertools)?
PS .:
Применение
Представьте a
список как набор меток времени некоторых событий, произошедших в ходе эксперимента:
timestamp event
47.8 1a
60.5 1b
67.4 2a
74.5 2b
78.5 1a
82.2 1b
89.5 2a
95.3 2b
101.7 1a
110.2 1b
121.9 2a
127.1 2b
...
Этот код будучи используется для сегментации этих событий в соответствии с различными временными окнами. Сейчас меня интересуют данные между 2
последовательными событиями; 'n> 2' будет использоваться только в исследовательских целях.
@glibdud: Ах, вы правы. Единственный тройник все еще завернут в одноэлементный кортеж. – user2357112