Вы говорите о 2D-списках, но ваш пример ввода - это фактически список списков кортежей (где каждый список содержит только одно значение кортежа). Я предполагаю, что это опечатка, и вы хотели написать ;
вместо ;
и создать фактический 2D-список:
let input =
[ [2; 3]
[2; 4]
[2; 5]
[3; 8]
[3; 6]
[3; 2]
[4; 1] ]
Теперь три элемента, которые вы хотите получить в результате, кажутся быть тремя подсписками с наименьшим последним элементом в списке. Самый простой способ получить их - отсортировать список списков по последнему элементу подсписков, а затем взять первые 3:
input
|> List.sortBy List.last
|> List.take 3
. Возвращает три подсписка, которые вы хотите, но не в Оригинальный заказ. Если вы хотите, чтобы они были в исходном порядке, вы можете сначала найти третий наименьший последний элемент, а затем использовать его для фильтрации исходного списка:
let last =
input
|> List.map List.last
|> List.sort
|> List.item 2
input
|> List.filter (fun l -> List.last l <= last)
Обратите внимание, что мой код неправильно обрабатывает такие случаи, как ввод меньше 3 или пустые списки, но это должно дать вам представление об одном из способов решения этой проблемы.