按第二个元素对元组列表进行排序

时间:2012-02-16 21:11:16

标签: sorting haskell tuples

我想按照第二个元素对元组列表进行排序。

示例输入:

[("Bob",3),("Terry",1)]

示例输出:

[("Terry",1)("Bob",3)]

3 个答案:

答案 0 :(得分:15)

另一个很酷的技巧是使用Data.Function中的on

import Data.Function (on)
import Data.List (sortBy)

sortBy (compare `on` snd) [...]

comparing没什么不同,但不时是一个很好的伎俩。

答案 1 :(得分:13)

您可以使用sortBycomparing

sortBy :: (a -> a -> Ordering) -> [a] -> [a]
comparing :: (Ord b) => (a -> b) -> a -> a -> Ordering

在这种情况下,我们想要通过第二个元素进行比较。您可以使用comparing snd来获取可以通过第二个元素比较两个元组的函数。

答案 2 :(得分:2)

考虑“常规”排序

sort xs = ... a < b ...

此类排序必须使用compare或其朋友,例如<。因此,如果您已经实施了这样的事情,那么您可以改为compare a ba < b而不是compare (snd a) (snd b)snd a < snd b

sort xs = ... snd a < snd b ...

当然,如果你变聪明,你将抽象出“访问者”,并使其成为排序功能的额外输入:

sortComparingOn f xs = ... f a < f b ...

你甚至可能完全抽出比较器:

sortBy cmp xs = ... a `cmp` b ...
Data.List中提供了

sortBy,如第三部分所述。