带别名的字典子集

时间:2016-07-28 01:21:03

标签: dictionary julia

我正在寻找一种简洁的方法来查找字典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)

仍然想知道是否有一种方法可以完成原始字典中的任务,这比直接反转它更直接。

1 个答案:

答案 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