Сортировка списка списков по элементу секунд - PullRequest
5 голосов
/ 08 января 2012

У меня трудное время, когда я пытаюсь упорядочить список списков по второму элементу, что-то вроде этого

list = [[_,B,_,_,_],[_,A,_,_,_],[_,C,_,_,_]]

в это:

list = [[_,A,_,_,_],[_,B,_,_,_],[_,C,_,_,_]]

Я пробовал:

sortBy compare $ [([1,2]!!1),([2,3]!!1)]

Но он фильтрует элементы секунд и упорядочивает их в [2,3].

Ответы [ 2 ]

9 голосов
/ 08 января 2012

То, что вы пытались сделать, это отсортировать список [([1,2]!!1),([2,3]!!1)], что эквивалентно [2, 3], по compare.Что вы хотите сделать, это использовать sortBy с функцией, которая сначала получает второй элемент, а затем сравнивает:

sortBySecond = sortBy (\ a b -> compare (a !! 1) (b !! 1))

Затем возьмите имеющийся у вас список и примените к нему эту функцию.:

sortBySecond [[1, 2], [2, 3]]

Вы можете сделать эту функцию более аккуратной, используя on из Data.Function:

import Data.Function

sortBySecond = sortBy (compare `on` (!! 1))

Вы также можете использовать comparing из Data.Ord:

sortBySecond = sortBy $ comparing (!! 1)
0 голосов
/ 08 января 2012

Еще одна идея, с которой я столкнулся, заключается в том, чтобы просто начать сортировку по второму элементу списка, используя tail.Я также попытался написать это бессмысленно - как упражнение для меня.

pfsortBySnd :: (Ord a) => [[a]] -> [[a]]
pfsortBySnd = sortBy second
            where second = comparing tail

sortBySnd :: (Ord a) => [[a]] -> [[a]]
sortBySnd xx = sortBy second xx
             where second x y = compare (tail x) (tail y)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...