我需要按照另一个列表的顺序对一个列表进行排序,但我不知道如何完成。
例如:我可以有一个类似于以下内容的列表a
:
[C, B, G, E]
还有一个列表b
(设置顺序):
[A, B, C, D, E, F, G, ...]
(仅作为示例,但这些不是实际值)
然后,列表 a
应该以与列表 b
相同的方式排序,从而排序为:
[B, C, E, G]
如何按照另一个列表的顺序进行排序?
最佳答案
您还可以将顺序映射到列表并对其进行排序:
Prelude> let order = zip ["A", "B", "C", "D", "E", "F", "G"] [0..]
Prelude> let myList = ["C", "B", "G", "E"]
Prelude> import Data.List (sort)
Prelude> map snd . sort . map (\x -> (lookup x order, x)) $ myList
["B","C","E","G"]
因此我们可以将这个函数定义为
sortAlong :: Eq b => [b] -> [b] -> [b]
sortAlong order = map snd . sortBy (comparing fst) . map (\x -> (lookup x z, x))
where
z = zip order [0..]
Ord
约束允许通过 Map
更有效地路由,但此版本只需要 Eq
:
> sortAlong "ABCDEFG" "CBGE"
"BCEG"
关于sorting - 按一个列表的顺序对另一个列表进行排序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26260752/