繁体   English   中英

在Haskell中订购列表清单

[英]Ordering a list of lists in Haskell

假设我有一个列表列表,例如[[1,3,4],[1,5,6,7],[2,8,0]]["QQQ", "RRRR", "TTTTT"] ,是否有一个函数可以按照内部列表中元素的数量对它们进行排序,即在Int列表中,第4个元素列表位于最前面,而在String列表中, T则位于前面,然后是R S'

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]]

sortBy从和Data.List模块comparing从Data.Ord会帮助你。

foo = sortBy (comparing (negate . length))

bar = foo ["QQQ", "RRRR", "TTTTT"]

我想添加另一种解决方案,以记住给定列表的长度。 否则,每次比较都会重新计算长度,这将导致大型列表的大量开销。

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)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM