2016-11-24 20 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或哈斯克尔 – Adirio

+0

@Adirio我希望它哈斯克尔 – CreZce

回答

3
  1. 排序子列表:map sort。你得到排序列表列表由子lsit的总和
  2. 排序它sortOn sum

sortOnsort(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) 

谢谢,Zeta

+0

或者,如果你想将它指向免费电话:'sortBy(比较总和)。地图排序'。 – Zeta

+0

@泽塔谢谢!这更优雅。 – Wentao

2

如果你想所有内部列表进行排序,那么你可以只申请sort功能,每个内部列表,这仅仅是map sort哈斯克尔

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

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

相关问题