簡體   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