2016-07-28 5 views
2

辞書のサブセットoを見つけ出すには、option_setのキーが含まれているか、そのキーのエイリアスがオプションセットに含まれています。エイリアスを持つ辞書のサブセット

o = Dict{Symbol,Any}(:a=>2,:b=>1.0,:c=>1//2,:d=>1,:e=>3.0) 
options_set = Set([:a :d :f]) 
aliases = Dict{Symbol,Symbol}(:c=>:d,:b=>:f) 
# I want the dictionary of the intersection, including the aliased names 
# i.e. Dict(:a=>2,:d=>1,:f=>1.0) or Dict(:a=>2,:d=>1//2,:f=>1.0) (which one is easier?) 

#Starting idea 
Dict([Pair(k,o[k]) for k in (keys(o) ∩ options_set)]) # Dict(:a=>2) 
Dict([Pair(k,o[k]) for k in ((keys(o) ∪ values(aliases)) ∩ options_set)]) # Dict(:a=>2,:d=>1) 

エイリアスキーを使用して結果の辞書の正しい値を取得する方法はありますか?


編集:私はもっとあるオリジナルの辞書からタスクを達成するための方法があるかどうすなわち

aliases2 = Dict{Symbol,Symbol}(:d=>:c,:f=>:b) 
dict1 = Dict([Pair(k,o[k]) for k in (keys(o) ∩ options_set)]) 
dict2 = Dict([Pair(k,o[aliases2[k]]) for k in (keys(aliases2) ∩ options_set)]) 
merge(dict1,dict2) 

はまだ不思議、それだけで、他の方向に別名を持っている方がはるかに簡単だということを実現それを最初に反転するよりも直接的です。

+0

質問が混乱します。この文脈で「エイリアス」とはどういう意味ですか?それが意味することを意味するならば、 ':c'と':d'は 'o'の中の別のものを参照してはいけませんか? –

+0

エイリアスの標準定義を意味します。はい、実際の場合、 ':c'と':d'は異なる値にすることは望ましくありません。この例では、これは問題が発生する可能性があるため、この例のように記述しました。この例ではこの部分が定義されていないため、どちらかの値をとることに注意しました。 –

+0

しかし、あなたの問題は悪いです。セットに矛盾がある場合、「正しい価値」はありません。 –

答えて

2

辞書を逆転させる方がより効果的かもしれませんが、ループを書くことができます。

julia> result = Dict{Symbol, Any}() 
Dict{Symbol,Any} with 0 entries 

julia> for (k, v) in o 
      if k in options_set 
       push!(result, k => v) 
      elseif haskey(aliases, k) 
       push!(result, aliases[k] => v) 
      end 
     end 
Dict{Symbol,Any} with 3 entries: 
    :a => 2 
    :d => 1 
    :f => 1.0 
関連する問題