Я не уверен, полностью ли я понимаю ваш вопрос, но следующее дает правильный вывод в соответствии с вашим образцом. Идея состоит в том, чтобы сначала отфильтровать значения, которые не имеют правильного ключа, а затем использовать Seq.pairwaise
(как в решении jpalmer), чтобы найти места, где значение изменяется:
let input = [ (1, 0); (2, 0); (2, 0); (2, 0); (1, 0); (2, 1); (2, 1); (1, 0); (2, 0) ]
let findValueChanges key input =
input
|> Seq.filter (fun (k, v) -> k = key) // Get values with the right key
|> Seq.pairwise // Make tuples with previous & next value
|> Seq.filter (fun ((_, prev), (_, next)) -> prev <> next) // Find changing points
|> Seq.map snd // Return the new key-value pair (after change)
Если вы хотите найти изменения для всех различных ключей, то вы можете использовать Seq.groupBy
, чтобы найти все возможные ключи (тогда вам не понадобится первая строка в findValueChanges
):
input
|> Seq.groupBy fst
|> Seq.map (fun (k, vals) -> findValueChanges k vals)
(Для вашего ввода значения для клавиши 1 не изменяются, поскольку значение всегда 1, 0
)