我想知道如何根据示例列表重新排序列表列表。 这是一个澄清我的问题的例子:
["Foo", "Bar", "Something"]
这是示例列表,现在我想重新排序下面显示的列表,只查看其中每个列表的头部:
[["Something", "one", "two", "three"], ["Foo", "four", "five", "six"],
["Bar", "seven", "eight", "nine"]]
到此:
[["Foo", "four", "five", "six"], ["Bar", "seven", "eight", "nine"],
["Something", "one", "two", "three"]]
由于
编辑:
我已经尝试映射交换两个元素的交换函数,但这不起作用,因为我在这里处理两个列表。
答案 0 :(得分:1)
可能是一种非常粗野的方法:
Prelude> let a = [["Something", "one", "two", "three"], ["Foo", "four", "five", "six"], ["Bar", "seven", "eight", "nine"]]
Prelude> let b = ["Foo", "Bar", "Something"]
Prelude> concatMap (\y -> filter (\(x:xs) -> x == y) a) b
[["Foo","four","five","six"],["Bar","seven","eight","nine"],["Something","one","two","three"]]
答案 1 :(得分:0)
基于列表理解的另一种解决方案可以是:
Prelude> let a = [["Something", "one", "two", "three"], ["Foo", "four", "five", "six"], ["Bar", "seven", "eight", "nine"]]
Prelude> let b = ["Foo", "Bar", "Something"]
Prelude> let c = [ y | x<-b, y<-a, x `elem` y ]
[["Foo","four","five","six"],["Bar","seven","eight","nine"],["Something","one","two","three"]]
您可以阅读本章,了解有关如何使用列表理解的更多说明:Lyah
答案 2 :(得分:0)
您希望根据自定义比较对列表进行排序。那么,我们来做吧!基本比较函数应该查看示例列表中出现的值的索引。
import Data.List
cmpIndex :: Eq a => [a] -> [a] -> [a] -> Ordering
cmpIndex example s1 s2 = compare (indexOf s1) (indexOf s2)
where indexOf s = findIndex (head s ==) example
这有点危险 - 调用head
始终是暂停的原因。但是让我们假设你知道我不知道的事情并继续前进。我们将为输入命名,以使测试更具可读性,然后启动ghci:
example = ["Foo", "Bar", "Something"]
list = [["Something", "one", "two", "three"], ["Foo", "four", "five", "six"], ["Bar", "seven", "eight", "nine"]]
*Main> sortBy (cmpIndex example) list
[["Foo","four","five","six"],["Bar","seven","eight","nine"],["Something","one","two","three"]]