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

16
我想要按照元组的第二个元素对列表进行排序。
示例输入:
[("Bob",3),("Terry",1)]

示例输出:

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

2
这是一道作业题吗?如果是的话,你应该添加“homework”标签。 - Daniel Wagner
3个回答

20

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

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

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

比较没什么不同,但偶尔可以用一个好技巧。


4
on有一些不错的技巧。我偶尔会发现equating = on (==)很有用。(comparing = on compare - Dan Burton

14

你可以使用sortBycomparing

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

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


如果我想要定义自己的排序函数以便在任何地方调用,那么我应该如何实现呢?我可能会需要多次使用这个函数。 - user1214840
换句话说,我想定义自己的排序函数,它接受一个元组列表,根据其第二个元素进行排序,然后返回相同排序的元组列表。 - user1214840
2
@user1214840 和任何其他定义一样:myFancySort = {- 在这里使用ehird的提示进行实现 -} - Daniel Wagner

2
考虑一个“常规”排序。
sort xs = ... a < b ...

这样的排序必须使用compare或其相关函数,如<。因此,如果您已经实现了这样的功能,那么您可以使用compare (snd a) (snd b)snd a < snd b代替简单的compare a ba < b

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

当然,如果您聪明一点,您可以将“访问器”抽象出来,并将其作为排序函数的附加输入:
sortComparingOn f xs = ... f a < f b ...

你甚至可以将比较器完全抽象出来:
sortBy cmp xs = ... a `cmp` b ...

sortBy 是在 Data.List 中提供的,正如 ehird 所提到的。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接