2016-07-28 53 views
2

我正在尋找一個簡明的方法來查找其集合option_set中包含的密鑰或其密鑰的別名在選項集中的字典o的子集。別名字典的子集

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