重新排列Erlang中的元素

5

我可以帮您重新定义一个包含特定词语的元组的顺序。

例如,我有一个元组列表,如下所示:

[{"a",["r001"]},
 {"bi",["bidder"]},
 {"bo",["an"]}]

但有时元组的顺序会发生变化,例如:

[{"bi",["bidder"]},
 {"a",["r001"]},
 {"bo",["an"]}]

或者

[{"bo",["an"]},
 {"a",["r001"]},
 {"bi",["bidder"]}]

元组的第一个字符串/列表是我的唯一键(“bo”,“a”,“bi”)

但我想能够重新排序元组列表,始终如下:

 [{"a",["r001"]},
     {"bi",["bidder"]},
     {"bo",["an"]}]

我该如何实现这个目标?

这段代码的功能是对List列表进行排序,排序规则是按照元素中第一个值的大小进行比较。具体实现是通过sort函数和一个匿名函数(fun(X,Y)->element(1,X)<element(1,Y) end)来完成的。 - user4651282
2
@Atomic_alarm lists:sort/2函数要求排序函数返回true,其中A小于或等于B,而不是小于B。 - Michael
@Michael,解释得很清楚,谢谢。 - user4651282
2个回答

5
这将解决问题:
lists:sort(fun({A,_},{B,_}) -> A =< B end, List).

或者使用这种方式,根据元组的第二个元素在第一个元素之后进行排序:

lists:sort(List).

我提供第二个版本,因为对于像这样的数据,如果没有自定义排序函数,它会更快。


当你对你的实现进行基准测试时,你可能只是在shell中写了lists:sort(fun({A,_},{B,_}) -> A =< B end, List)。但这并不完全正确。Erlang不会编译直接输入到shell中的表达式,而是解释它们。因此,你的自定义函数将比它应该的速度慢得多。我尝试过用shell编写比较函数和用单独模块编译的函数,发现编译的函数性能很好,而shell编写的函数确实要慢得多。所以我认为你的速度说法在这里是不正确的。 - Lol4t0
谢谢您指出这一点!我刚刚尝试了一些我创建的样本数据,在shell和模块中进行了测试,但我必须说,我无法在任何比较中实现数量级差异,但是对于某些情况,shell要慢得多。我不认为引用数字是公平的,因为每个数据的变化可能如此之大,取决于其起始排序状态,但对于我的情况,我发现lists:sort/1比lists:sort/2快30%。我还尝试了您提出的lists:keysort/2,并发现它比lists:sort/1快19%。回答已更正。 - Michael

3

如果您需要根据指定元素排序,只需按照指定元素进行排序即可

lists:keysort(1, List).

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