在Julia中按多个键排序Dicts数组

时间:2017-10-27 12:44:17

标签: arrays sorting dictionary julia

我有一大堆[TestMethod] public void SaveCategoriesAsync_When_Then() { A.CallTo(() => this.articleRepository.GetArticles(A<IList<long>>._)).Returns(new List<ArticleModel>()); Func<Task> func = async () => await this.testee.SaveCategoriesAsync(new List<int>()); func.ShouldThrow<Exception>(); } s,看起来都像这样

Dict

我需要按{ "id": 12345, "user_id": "6789", "question_id": "some_question_id", "correct": "true", "actions": "...", "consequentiality": 0, "timestamp": 1505123456.000 } (question_id, user_id, id, consequentiality)进行排序,question_id移动速度最慢,consequentiality移动速度更快 - 如果愿意,可以分组和分组,但我需要在某些情况下对有序数组执行交换,其中大多数往往发生在组之间。我一直在玩Base.sort,将不同的功能传递给bylt。我想出的最好的方法是将多个排序组​​合在一起,并将不同的密钥传递给每个by子句,如

sort(sort(sort(sort(df, by=x->x["question_id"]), by=x->x["user_id"] ...
你得到了照片。到目前为止,即使使用MergeSort等稳定算法,我也无法达到令人满意的稳定排序。

帮助?

编辑by子句中使用元组是否有意义?但是,如何反转非数字元素的排序?

1 个答案:

答案 0 :(得分:1)

以下是在注释中使用lt=...清除解决方案的方法的演示。请注意,这仅适用于元组,因为它为元组重新定义isless。如果有热情,也许可以将这样的东西纳入朱莉娅或某些包装中。

julia> struct RevNext
       end

julia> import Base: isless

julia> function isless(t1::Tuple, t2::Tuple)
           n1, n2 = length(t1), length(t2)
           reverse = false
           for i = 1:min(n1, n2)
               a, b = t1[i], t2[i]
               if !isequal(a, b)
                   return reverse ? isless(b, a) : isless(a,b)
               else
                   reverse = isa(a,RevNext)
               end
           end
           return n1 < n2
       end
WARNING: Method definition isless(Tuple, Tuple) ...
isless (generic function with 53 methods)

要使用它,我们会写sort(M,by=x->(x[:b], RevNext(), x[:a]))。随机生成的向量M的示例:

julia> M = [Dict(:a=>rand(),:b=>rand(Bool)) for i=1:10]
10-element Array{Dict{Symbol,Any},1}:
 Dict{Symbol,Any}(Pair{Symbol,Any}(:a, 0.735352),Pair{Symbol,Any}(:b, true)) 
 Dict{Symbol,Any}(Pair{Symbol,Any}(:a, 0.537437),Pair{Symbol,Any}(:b, true)) 
 Dict{Symbol,Any}(Pair{Symbol,Any}(:a, 0.314947),Pair{Symbol,Any}(:b, true)) 
 Dict{Symbol,Any}(Pair{Symbol,Any}(:a, 0.9723),Pair{Symbol,Any}(:b, false))  
 Dict{Symbol,Any}(Pair{Symbol,Any}(:a, 0.605042),Pair{Symbol,Any}(:b, true)) 
 Dict{Symbol,Any}(Pair{Symbol,Any}(:a, 0.256509),Pair{Symbol,Any}(:b, false))
 Dict{Symbol,Any}(Pair{Symbol,Any}(:a, 0.133487),Pair{Symbol,Any}(:b, false))
 Dict{Symbol,Any}(Pair{Symbol,Any}(:a, 0.320249),Pair{Symbol,Any}(:b, false))
 Dict{Symbol,Any}(Pair{Symbol,Any}(:a, 0.409549),Pair{Symbol,Any}(:b, true)) 
 Dict{Symbol,Any}(Pair{Symbol,Any}(:a, 0.421471),Pair{Symbol,Any}(:b, true)) 

julia> sort(M,by=x->(x[:b], RevNext(), x[:a]))
10-element Array{Dict{Symbol,Any},1}:
 Dict{Symbol,Any}(Pair{Symbol,Any}(:a, 0.9723),Pair{Symbol,Any}(:b, false))  
 Dict{Symbol,Any}(Pair{Symbol,Any}(:a, 0.320249),Pair{Symbol,Any}(:b, false))
 Dict{Symbol,Any}(Pair{Symbol,Any}(:a, 0.256509),Pair{Symbol,Any}(:b, false))
 Dict{Symbol,Any}(Pair{Symbol,Any}(:a, 0.133487),Pair{Symbol,Any}(:b, false))
 Dict{Symbol,Any}(Pair{Symbol,Any}(:a, 0.735352),Pair{Symbol,Any}(:b, true)) 
 Dict{Symbol,Any}(Pair{Symbol,Any}(:a, 0.605042),Pair{Symbol,Any}(:b, true)) 
 Dict{Symbol,Any}(Pair{Symbol,Any}(:a, 0.537437),Pair{Symbol,Any}(:b, true)) 
 Dict{Symbol,Any}(Pair{Symbol,Any}(:a, 0.421471),Pair{Symbol,Any}(:b, true)) 
 Dict{Symbol,Any}(Pair{Symbol,Any}(:a, 0.409549),Pair{Symbol,Any}(:b, true)) 
 Dict{Symbol,Any}(Pair{Symbol,Any}(:a, 0.314947),Pair{Symbol,Any}(:b, true))