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