在Julia中按多个元素对矢量矢量进行排序

Mar*_*tle 1 sorting vector julia

我已经很好地阅读了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]]
Run Code Online (Sandbox Code Playgroud)

继续我正在寻找的东西:

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]]
Run Code Online (Sandbox Code Playgroud)

因此,对火箭科学不应该有任何要求.

我可以通过两种方式之一轻松地通过封闭矢量的第一个元素对矢量进行排序:

v = sort(v, lt = (x, y) -> isless(x[1], y[2]))
Run Code Online (Sandbox Code Playgroud)

要么:

v = sort(v, by = x -> x[1])
Run Code Online (Sandbox Code Playgroud)

这两种方法都产生相同的答案:

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]]
Run Code Online (Sandbox Code Playgroud)

因此,正如您所看到的,我已经按照所包含的向量的第一个元素进行排序,而不是通过后续元素进行排序.

那么,回到标题中的问题,是否有一种使用sort()函数对多个元素进行排序的方法?

我实际上可以使用循环得到我想要的东西:

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

要么:

for i = 3:-1:1
    v = sort(v, by = x -> x[i])
end
Run Code Online (Sandbox Code Playgroud)

但是,我不想重新发明轮子,所以如果有一种方法可以在sort()功能中进行,我很乐意了解它.

Bog*_*ski 5

您可以使用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]
Run Code Online (Sandbox Code Playgroud)

编辑:我刚刚检查过这是Julia 0.6的解决方案.在朱莉娅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]
Run Code Online (Sandbox Code Playgroud)