【问题标题】:Sort a list of tuples by their second elements按第二个元素对元组列表进行排序
【发布时间】:2012-03-08 07:33:06
【问题描述】:

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

示例输入:

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

示例输出:

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

【问题讨论】:

  • 这是一道作业题吗?如果是这样,您应该添加homework 标签。

标签: sorting haskell tuples


【解决方案1】:

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

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

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

comparing 没有太大区别,但时不时会出现一个不错的技巧。

【讨论】:

  • on 有一些不错的技巧。我偶尔会发现equating = on (==) 很有用。 (comparing = on compare)
【解决方案2】:

您可以使用sortBycomparing

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

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

【讨论】:

  • 如果我想定义自己的排序函数以从任何地方调用,那么我该怎么做呢?我可能需要多次使用它
  • 换句话说,我想定义我自己的排序函数,该函数接受一组元组,根据其第二个元素对其进行排序,然后返回相同的元组排序列表。
  • @user1214840 与任何其他定义相同:myFancySort = {- implementation using ehird's hints here -}
【解决方案3】:

考虑一个“常规”排序

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

这样的排序必须使用compare,或者它的朋友,比如&lt;。因此,如果您已经实现了这样的事情,那么您可以改为使用compare (snd a) (snd b)snd a &lt; snd b 而不是compare a ba &lt; b

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

当然,如果你够聪明,你会抽象出“访问器”,并将其作为排序函数的附加输入:

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

您甚至可以完全抽象出比较器:

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

sortBy 在 Data.List 中提供,如 ehird 所述。

【讨论】:

    猜你喜欢
    • 2012-03-13
    • 1970-01-01
    • 1970-01-01
    • 2022-08-18
    • 2011-05-21
    • 2016-03-17
    • 1970-01-01
    • 1970-01-01
    • 2011-02-07
    相关资源
    最近更新 更多