在Julia中对数组的数组进行排序

5

我有一个数组,其中每个元素也是一个数组,我想按它们的第一个元素将这些数组在数组中排序。在Julia中是否可能实现这样的操作?

例如,我有:

a = (Array{Int64, 1})[]
push!(a, [5, 2 , 3])
push!(a, [3, 1 , 4])

我希望您能按照每个数组的第一个元素排序,使结果为[[3,1,4], [5,2,3]。这是因为在Julia中,堆无法将数组作为元素添加到堆中。有任何想法吗?

2
另外,这个一行代码:sort(a,by=first) 是有效的(first是一个有用的函数需要记住)。 - Dan Getz
1个回答

16

1.0版本更新说明:

sort(a)

这就是全部。Julia版本1.0为数组定义了<作为我下面描述的词典排序,因此您不再需要手动指定它。


0.6之前的答案

您可以将自定义的lt(小于)运算符作为sort的关键字参数进行指定:(文档链接)

julia> sort(a, lt=(x,y)->isless(x[1], y[1]))
2-element Array{Array{Int64,1},1}:
 [3,1,4]
 [5,2,3]

更普遍地,您可以使用lexless以词典顺序稳健地对数组进行排序:

julia> push!(a, [5, 1, 1])
3-element Array{Array{Int64,1},1}:
 [5,2,3]
 [3,1,4]
 [5,1,1]

julia> sort(a, lt=lexless)
3-element Array{Array{Int64,1},1}:
 [3,1,4]
 [5,1,1]
 [5,2,3]

谢谢,这样就可以了。我只是想问一下,你是否熟悉JULIA中的堆(heaps)?你知道JULIA中的堆是否可以将数组作为元素吗?我知道Python有这个功能,我想在JULIA中复制它,而数组的数组只是我脑海中浮现的一个想法。但是我不太喜欢它,因为它的时间复杂度比堆要差。 - M.Puk
1
使用可选的 ord 参数来指定词典序排序:Collections.heapify(a, Base.Order.Lexicographic) - mbauman
有趣。但使用Collections.heappush!(v, x[, ord])函数是否也能维护堆顺序呢?并且,是否可以用它将数组添加到堆中呢?例如,像这样Collections.heappush!(a,[5,2,3])?我尝试了很多变化,但都没有成功。 - M.Puk
我之前尝试使用Collections.heappush!(a, [10, 1 , 4])添加元素,但没有成功。在你建议试用heapify后,我尝试了Collections.heappush!(a, [10, 1 , 4], Base.Order.Lexicographic),它成功了,非常感谢你的建议。但是,Lexicographic是基于字母表排序的,对吗?有可能使用这个函数进行排序:lt=(x,y)->isless(x[1], y[1]) - M.Puk
1
词典排序指的是按照第一个元素进行排序,如果相等,则按照下一个元素排序。它还可以处理包括空数组在内的长度不同的数组。但是,如果你只想改变lt比较函数,你可以使用Base.Order.ord((x,y)->isless(x[1], y[1]), identity, false)构建自定义排序。 - mbauman
谢谢,这对我很有帮助 :-) - M.Puk

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