Я предлагаю использовать функцию Разделение.Чтобы получить каждый элемент списка, сгруппированный с его непосредственными соседями, вы можете сделать это
Partition[{a,b,c,d,e}, 3, 1]
, чтобы получить это:
{{a,b,c}, {b,c,e}, {c,d,e}}
Зная это, мы можем сделать «выбор с соседями»функция, которая приблизительно соответствует вашей спецификации:
SelectWN[list_, firstq_, lastq_, trinaryfunc_] := Join[
If[firstq, {First@list}, {}],
Select[Partition[list, 3, 1], trinaryfunc@@#&][[All,2]],
If[lastq, {Last@list}, {}]]
Обратите внимание, что в аргументах trinaryfunc # 2 - это сам элемент списка, # 1 - левый сосед, а # 3 - правый сосед.Было бы неплохо обобщить это, чтобы использовать любое количество соседей, а не только непосредственных соседей, но тогда вам нужен лучший способ ссылки на них, чем аналог {# 1, # 2, # 3}.