2016-11-24 2 views
2

Как мне сортировать [[2,3,1], [0,0], [1,0,4,3]], так что я получаю [[0,0], [1,2,3], [0,1,3,4]]?Как отсортировать список списков по их сумме и внутренним элементам?

Я хочу

  1. рода каждого суб-список и затем
  2. сортировки общего списка по сумме их пункта

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

+1

Не уверен, что если вы хотите Python или Haskell – Adirio

+0

@Adirio Хочу Haskell – CreZce

ответ

3
  1. Подкатегория сортировки: map sort. Вы получаете список отсортированный список
  2. разбирайтесь на сумму суб-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) 

Thanks, Zeta.

+0

Или, если вы хотите указать бесплатно: 'SortBy (сравнивая сумму). карта сортировка'. – Zeta

+0

@Zeta Спасибо! Это более элегантно. – Wentao

2

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

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

import Data.List (sortOn) 

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

Я думаю, что он просто изменил свой ответ, немного раньше, чем ваш. – CreZce

+0

Имейте в виду, что 'sortOn' доступен только для GHC 7.10+ (base-4.8.0.0). – Zeta

+0

> 2016 > использовать GHC ниже 7,10 – Shersh

Смежные вопросы