按照元组第二个元素排序列表

5

我有一个字典,想要将它转换为列表。然后我想根据第二个元素(Value)从小到大对由{Key,Value}对组成的结果列表进行排序。

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

谢谢

2个回答

13

这个问题可以使用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}]


太棒了,完全忽略了那个。:/ - some_id
如果我想排序并且只返回第一个元素的列表怎么办? - some_id
由于排序的元素不能过早丢弃,因此您必须将其分为两个步骤;排序,然后运行:[ Key || {Key,Value} <- L ] 或相应的 lists:map/2 函数。 - D.Nibon
点赞。你的函数在这种情况下是正确的。我留下我的答案,因为如果值相等,它也会完成关键字排序。 - I GIVE TERRIBLE ADVICE

7

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

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总是自动从第一个元素开始比较元组。该函数交换第一个和第二个元素,使第二个元素充当比较的第一个点。如果值相同,则使用您字典中的键来排序条目的顺序。

这个可以适用于键值对 [{1, 14}, {3, 10}, {2, 13}] 吗?针对整数?谢谢。 - some_id
这将适用于任何值。Erlang术语始终可以相互比较。如果您的元组有两个值,并且您希望第二个值为首位,则上述函数将涵盖这些情况。您可以尝试并查看。 - I GIVE TERRIBLE ADVICE
如果我想排序并且只返回第一个元素的列表怎么办? - some_id
1
[Key || {Key, _Val} <- List]. - I GIVE TERRIBLE ADVICE
1
@elgolondrino 这基本上只返回所有键的列表。但是,您收到的错误是因为您使用了像key_Y这样的原子名称。变量需要使用KeyY,其中它们区分大小写。小写=原子,大写=变量。 - I GIVE TERRIBLE ADVICE
显示剩余3条评论

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