【问题标题】:Sorting a list of based on the 2nd element of a tuple根据元组的第二个元素对列表进行排序
【发布时间】:2011-05-21 04:27:15
【问题描述】:

我有一本字典,想把它转换成一个列表。然后我想根据第二个元素(值)对包含 {Key, Value} 对的结果列表从 min 到 max 进行排序。

列表是否有内置的排序方法来处理这个问题,或者如何做到这一点?

谢谢

【问题讨论】:

    标签: list sorting erlang tuples


    【解决方案1】:

    函数lists:keysort/2 非常适合这个。

    1> lists:keysort(2, [{a,b},{b,a},{b,b}]).

    [{b,a},{a,b},{b,b}]

    2> lists:keysort(2, [{1,14},{3,10},{2,13}]).

    [{3,10},{2,13},{1,14}]

    【讨论】:

    • 太棒了。完全忽略了这一点。 ://
    • 如果我想排序并且只返回First元素的列表呢?
    • 因为排序元素的排序性质不能被过早地丢弃。因此,您必须将其分为两个步骤;排序然后运行:[ Key || {Key,Value} <- L ]或对应的lists:map/2函数。
    • 赞成。您的功能适合这种情况。我留下我的答案,因为如果值相等,它也会完成对键的排序。
    【解决方案2】:

    按第二个元素排序的最简单方法是定义您自己的排序函数,其工作方式如下:

    fun({KeyA,ValA}, {KeyB,ValB}) -> {ValA,KeyA} =< {ValB,KeyB} end.
    

    并在lists:sort/2中调用它:

    1> lists:sort(fun({KeyA,ValA}, {KeyB,ValB}) -> {ValA,KeyA} =< {ValB,KeyB} end., [{a,b},{b,a},{b,b}]).
    [{b,a},{a,b},{b,b}]
    

    这是因为 Erlang 总是会自动比较元组从第一个元素到最后一个元素。此函数交换第一个和第二个元素,因此第二个元素充当第一个比较点。然后,您的 dict 中的 Key 将用于对值相同的条目进行排序。

    【讨论】:

    • 不错1。这适用于 [{1, 14}, {3, 10}, {2, 13} 的键值对吗?整数?谢谢
    • 这适用于任何值。 Erlang 术语总是可以相互比较。如果您的元组有两个值并且您希望第二个值领先,那么上面的函数将涵盖这些情况。你可以试试看。
    • 再次感谢您的帮助。欣赏它。
    • [Key || {Key, _Val} &lt;- List].
    • @elgolondrino 这基本上只是返回所有键的列表。但是,您收到的错误是由于您使用了像 key_Y 这样的名称,它们是原子。变量需要使用KeyY,它们区分大小写。小写 = 原子,大写 = 变量。
    猜你喜欢
    • 2012-03-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-04-30
    • 1970-01-01
    • 2012-03-13
    • 2021-10-28
    相关资源
    最近更新 更多