Сортировка вектора векторов по нескольким элементам в Julia - PullRequest
0 голосов
/ 29 июня 2018

Я хорошо прочитал раздел «Функции сортировки» руководства Julia и взглянул на некоторые из подобных вопросов, которые уже задавались на этой доске, но я не думаю, что нашел ответ на мой вопрос. Извиняюсь, если что-то пропустил.

По существу, у меня есть вектор векторов с вложенными векторами, содержащими целые числа. Для целей примера каждый заключенный вектор содержит 3 целых числа, но это может быть любое число. Я хочу отсортировать вложенные векторы по первому элементу, затем по второму элементу, затем по третьему элементу и т. Д.

Начнем с вектора:

v = [[3, 6, 1], [2, 2, 6], [1, 5, 9], [2, 1, 8], [3, 7, 9],
    [1, 1, 2], [2, 2, 2], [3, 6, 2], [1, 2, 5], [1, 5, 6],
    [3, 7, 4], [2, 1, 4], [2, 2, 1], [3, 1, 2], [1, 2, 8]]

И продолжайте с тем, что я на самом деле ищу:

v = [[1, 1, 2], [1, 2, 5], [1, 2, 8], [1, 5, 6], [1, 5, 9], 
    [2, 1, 4], [2, 1, 8], [2, 2, 1], [2, 2, 2], [2, 2, 6], 
    [3, 1, 2], [3, 6, 1], [3, 6, 2], [3, 7, 4], [3, 7, 9]]

Так что не должно быть никаких требований к ракетостроению.

Я могу легко отсортировать вектор по первому элементу вложенных векторов одним из двух способов:

v = sort(v, lt = (x, y) -> isless(x[1], y[2]))

или

v = sort(v, by = x -> x[1])

Оба эти метода дают один и тот же ответ:

v = [[1, 5, 9], [1, 1, 2], [1, 2, 5], [1, 5, 6], [1, 2, 8],
    [2, 2, 6], [2, 1, 8], [2, 2, 2], [2, 1, 4], [2, 2, 1], 
    [3, 6, 1], [3, 7, 9], [3, 6, 2], [3, 7, 4], [3, 1, 2]]

Итак, как вы можете видеть, я отсортировал по первому элементу вложенных векторов, но не по последующим элементам.

Итак, чтобы вернуться к вопросу в заголовке, существует ли метод сортировки по нескольким элементам с использованием функции sort()?

Я могу получить то, что хочу, используя циклы:

for i = 3:-1:1
    v = sort(v, lt = (x, y) -> isless(x[i], y[i]))
end

или

for i = 3:-1:1
    v = sort(v, by = x -> x[i])
end

Однако я не хочу заново изобретать колесо, поэтому, если есть способ сделать это в функции sort(), я бы хотел узнать об этом.

1 Ответ

0 голосов
/ 29 июня 2018

Вы можете использовать lexless функцию в качестве lt аргумента ключевого слова, который делает именно то, что вы хотите, если я правильно понял ваш вопрос:

julia> sort(v, lt=lexless)
15-element Array{Array{Int64,1},1}:
 [1, 1, 2]
 [1, 2, 5]
 [1, 2, 8]
 [1, 5, 6]
 [1, 5, 9]
 [2, 1, 4]
 [2, 1, 8]
 [2, 2, 1]
 [2, 2, 2]
 [2, 2, 6]
 [3, 1, 2]
 [3, 6, 1]
 [3, 6, 2]
 [3, 7, 4]
 [3, 7, 9]

РЕДАКТИРОВАТЬ: Я только что проверил, что это решение для Julia 0.6. В Julia 0.7 вы можете просто написать:

julia> sort(v)
15-element Array{Array{Int64,1},1}:
 [1, 1, 2]
 [1, 2, 5]
 [1, 2, 8]
 [1, 5, 6]
 [1, 5, 9]
 [2, 1, 4]
 [2, 1, 8]
 [2, 2, 1]
 [2, 2, 2]
 [2, 2, 6]
 [3, 1, 2]
 [3, 6, 1]
 [3, 6, 2]
 [3, 7, 4]
 [3, 7, 9]
...