コメントにlt=...
を使用してソリューションをクリーンアップする方法のデモンストレーションです。これは、タプルに対してのみisless
を再定義するので、タプルでのみ機能することに注意してください。熱狂があるなら、多分このような何かがJuliaかいくつかのパッケージに組み込まれるかもしれません。
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))
ソート '試し(= X-> getindexによってDF、(X、( "question_id"、 "USER_ID"、 "ID"、 "consequentiality")))。 ' –
数値以外の値の順序を逆にすることについては、これは' lt = 'パラメータでより小さいカスタム関数を必要とするかもしれません。 –
'getindex'に関して、うまくいきます、ありがとう。タプルでキーを指定するのと同じですか? 'lt'関数に関しては、チェーンを作るのか、もっと洗練されたものが必要ですか?以前にチェーンチェーンを試したときに、私が望む相対的な順序を得ることができなかったので。 'getindex'(またはタプル?)を持つのが助けになるのでしょうか? – Morpheu5