Сортировка списка по 2-му элементу кортежа - PullRequest
4 голосов
/ 06 декабря 2010

У меня есть словарь, и я хочу преобразовать его в список. Затем я хотел бы отсортировать результирующий список, состоящий из пар {Key, Value}, от минимального до максимального в зависимости от 2-го элемента (Value).

Существует ли встроенный метод сортировки для списков, чтобы справиться с этим, или как это сделать?

Спасибо

Ответы [ 2 ]

11 голосов
/ 07 декабря 2010

Функция выводит список: 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}]

6 голосов
/ 06 декабря 2010

Самый простой способ сортировки по второму элементу - определить собственную функцию сортировки, которая может работать следующим образом:

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 всегда будет автоматически сравнивать кортежи от первого до последнего элемента. Эта функция меняет местами первый и второй элементы, поэтому второй действует как первая точка сравнения. Затем ключ в вашем диктанте будет использоваться для заказа записей, значения которых совпадают.

...