我想知道是否有一种有效/简单的方法可以通过匹配设置顺序的另一个列表的值来重新排列列表列表。更具体地说,如果我有以下列表:
[["a", "1", "2"], ["b", "2", "3"]]
我想用以下列表订购:
["b", "a"]
产生新排序的列表:
[["b", "2", "3"], ["a", "1", "2"]]
有谁知道如何做到这一点?
提前致谢!
最诚挚的问候, Skyfe。
答案 0 :(得分:6)
基本上,这可以通过提供特殊的排序功能来实现,
import Data.List
import Data.Ord
byLoc :: Eq a => [a] -> -- The list that we're sorting by
[a] -> -- First list
[a] -> -- Second list
Ordering
byLoc ords = comparing (elemIndex . head)
comparing
接受一个接收两个列表的函数,并在我们的排序列表中查找每个列表的第一个元素,比较位置。
然后我们就有了
sortLoc ords = sortBy (byLoc ords)
我们已经完成了。不幸的是,这真的很慢。
更快的解决方案是
import Data.Maybe
import Data.List
sortLoc ords xs = mapMaybe lookup ords
where lookup e = find ((==e) . head) xs
这里我们只是在mapMaybe
的列表中查找相应的元素。如果没有找到任何元素,那么我们就跳过它。
或者如果您想支持具有相同键的多个元素
sortLoc ords xs = mapConcat lookup ords
where lookup e = filter ((==e) . head) xs