如果我有一个列表,如[[1,3,4],[1,5,6,7],[2,8,0]]
或["QQQ", "RRRR", "TTTTT"]
,是否有一个函数可以按内部列表中的元素数量排序,即Int
列表中的元素,4元素列表位于前面,在String
列表中,T
位于前面,然后是R
s?
答案 0 :(得分:3)
将sortBy与自定义谓词一起使用:
Prelude> import Data.List
Prelude Data.List> let l = [[1,3,4],[1,5,6,7],[2,8,0]]
Prelude Data.List> sortBy (\e1 e2 -> compare (length e2) (length e1)) l
[[1,5,6,7],[1,3,4],[2,8,0]]
编辑:感谢@JJJ提供更漂亮的变体
Prelude Data.List> import Data.Ord
Prelude Data.List Data.Ord> sortBy (flip $ comparing length) l
[[1,5,6,7],[1,3,4],[2,8,0]]
答案 1 :(得分:1)
sortBy
和来自Data.Ord的comparing
将帮助您。
foo = sortBy (comparing (negate . length))
bar = foo ["QQQ", "RRRR", "TTTTT"]
答案 2 :(得分:0)
我想添加另一个记住给定列表长度的解决方案。否则,每次比较都会重新计算长度,这对于大型列表来说意味着很多开销。
import Control.Arrow ((&&&))
import Data.List (sort, sortBy)
import Data.Ord (comparing)
sortByLen :: [[a]] -> [[a]]
sortByLen = map snd . sortBy (comparing fst) . map ((negate . length) &&& id)
如果您还希望按字典顺序排列相同长度的列表,则可以使用稍微简单的
sortByLen' :: (Ord a) => [[a]] -> [[a]]
sortByLen' = map snd . sort . map ((negate . length) &&& id)