繁体   English   中英

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

[英]Sort a list of tuples by their second elements

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

输入示例:

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

示例输出:

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

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

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

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

没有什么不同, comparing但不时是一个很好的技巧。

您可以使用sortBycomparing

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

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

考虑“常规”排序

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

这种排序必须使用compare ,或其朋友,如< 因此,如果你已经实现了这样的事情,那么你可以改为compare (snd a) (snd b)或者snd a < snd b而不是仅仅compare aba < b snd a < snd b

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

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

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

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

sortBy cmp xs = ... a `cmp` b ...

sortBy中提供了sortBy,如第三篇所述。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM