Вот довольно простое решение:
let groups =
playersScore
|> List.collect (fun (players, game) -> players |> List.map (fun player -> player, game))
|> List.groupBy (fun (player, _) -> player)
|> Map.ofList
|> Map.map (fun _ games -> games |> List.map snd)
Разбейте список списков на плоскую структуру, сгруппируйте их по игроку, затем преобразуйте в карту с игроком в качестве ключа и, наконец, отобразите картузначения, чтобы получить только название игры.Это дает следующую карту:
map
[("Player 1", ["First Game"; "Last Game"]);
("Player 2", ["First Game"; "Second Game"; "Last Game"]);
("Player 3", ["Second Game"; "Third Game"; "Last Game"]);
("Player 4", ["Second Game"; "Last Game"])]
РЕДАКТИРОВАТЬ
Чтобы сохранить вещи в виде списка, вы можете просто использовать List.map
вместо Map.ofList
и Map.map
:
let groups =
playersScore
|> List.collect (fun (players, game) -> players |> List.map (fun player -> player, game))
|> List.groupBy (fun (player, _) -> player)
|> List.map (fun (player, games) -> player, games |> List.map snd)
Возвращает эквивалентный результат в виде списка:
[("Player 1", ["First Game"; "Last Game"]);
("Player 2", ["First Game"; "Second Game"; "Last Game"]);
("Player 3", ["Second Game"; "Third Game"; "Last Game"]);
("Player 4", ["Second Game"; "Last Game"])]