根据示例列表重新排序列表

时间:2013-09-26 10:24:00

标签: list haskell

我想知道如何根据示例列表重新排序列表列表。 这是一个澄清我的问题的例子:

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

由于

编辑:

我已经尝试映射交换两个元素的交换函数,但这不起作用,因为我在这里处理两个列表。

3 个答案:

答案 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"]]