如何按照总和和内部元素对列表进行排序?

时间:2016-11-24 14:49:59

标签: sorting haskell

如何对[[2,3,1], [0,0], [1,0,4,3]]进行排序,以便获得[[0,0], [1,2,3], [0,1,3,4]]

我想

  1. 对每个子列表进行排序,然后
  2. 按项目总和排序总列表
  3. 我有一些Python经验,并且有内置函数,如sort(list, key=sum)。但是,我不知道如何在Haskell中做同样的事情。有人可以帮助我离开这里吗?

2 个答案:

答案 0 :(得分:3)

  1. 排序子列表:map sort。您将获得已排序列表的列表
  2. 按子lsit sortOn sum
  3. 的总和对其进行排序

    sortOn是Haskell中sort(list, key=sum)的对应部分:

    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)
    

    谢谢,Zeta

答案 1 :(得分:2)

如果要对所有内部列表进行排序,那么您只需将sort函数应用于每个内部列表,该列表在 Haskell 中仅为map sort

如果您希望通过某个比较器对所有列表进行排序,则可以使用非常易理解的函数sortBy。但是来自wentao回答的sortBy函数示例效率不高,因为它每次都会计算每个子列表的总和。相反,最好使用sortOn函数,该函数使用结果的记忆。它甚至更短。接下来是正确的解决方案:

import Data.List (sortOn)

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