Как отсортировать список списков по их сумме и внутренним элементам?

79
6

Как сортировать [[2,3,1], [0,0], [1,0,4,3]] чтобы получить [[0,0], [1,2,3], [0,1,3,4]]?

я хочу

сортировать каждый под-список, а затем сортировать общий список по сумме их позиции

У меня есть опыт Python, и есть встроенные функции, такие как sort(list, key=sum). Однако я не знаю, как сделать то же самое в Haskell. Может ли кто-нибудь помочь мне уйти отсюда?

спросил(а) 2021-01-19T13:45:30+03:00 9 месяцев назад
1
Решение
92

Сортировка суб-списка: map sort. Вы получаете список отсортированного списка Сортируйте его по сумме sub-lsit sortOn sum

sortOn является копией sort(list, key=sum) в Haskell:

sortOn :: Ord b => (a → b) → [a] → [a]

Сортировка:

import Data.List

doubleSort :: (Ord a, Num a) => [[a]] -> [[a]]
doubleSort = sortOn sum . map sort

или

doubleSort dlist = sortOn sum (map sort dlist)

Спасибо, Зета.

ответил(а) 2021-01-19T13:45:30+03:00 9 месяцев назад
79

Если вы хотите отсортировать все внутренние списки, вы можете просто применить функцию sort к каждому внутреннему списку, который является только map sort по map sort в Haskell.

Если вы хотите отсортировать все списки некоторым компаратором, вы можете использовать очень понятную функцию sortBy. Но sortBy функции sortBy из ответа goao неэффективен, так как каждый раз подсчитывает сумму каждого подсписок. Вместо этого лучше использовать функцию sortOn которая использует memoization результатов. И это еще короче. Итак, правильное решение следующее:


import Data.List (sortOn)

sumSort :: (Ord a, Num a) => [[a]] -> [[a]]
sumSort = sortOn sum . map sort

ответил(а) 2021-01-19T13:45:30+03:00 9 месяцев назад
Ваш ответ
Введите минимум 50 символов
Чтобы , пожалуйста,
Выберите тему жалобы:

Другая проблема