У меня есть следующий список кортежей, упорядоченных по первому элементу.Я хочу сгруппировать время по
- Если второй элемент кортежа больше 50, он будет в своем собственном кластере.
- В противном случае кластеризуйте элементы, сумма которых равнаменьше 50.
- Порядок не может быть изменен.
код:
let values =
[("ACE", 78);
("AMR", 3);
("Aam", 6);
("Acc", 1);
("Adj", 23);
("Aga", 12);
("All", 2);
("Ame", 4);
("Amo", 60);
//....
]
values |> Seq.groupBy(fun (k,v) -> ???)
Ожидаемое значение будет
[["ACE"] // 78
["AMR"; "Aam"; "Acc"; "Adj"; "Aga"; "All"] // 47
["Ame"] // 4
["Amo"] // 60
....]
В идеале я хочу равномерно распределить вторую группу (["AMR"; "Aam"; "Acc"; "Adj"; "Aga"; "All"]
, получившую сумму 47) и третью (["Ame"]
, в которой всего 4).
Как реализовать это в F #?
У меня было следующее решение.Используется изменяемая переменная.Это не F # идиоматический?Является ли for ... do
обязательным в F # или это синтаксический сахар какой-то функциональной конструкции?
seq {
let mutable c = []
for v in values |> Seq.sortBy(fun (k, _) -> k) do
let sum = c |> Seq.map(fun (_, v) -> v) |> Seq.sum
if not(c = []) && sum + (snd v) > 50
then
yield c
c <- [v]
else
c <- List.append c [v]
}