2016-07-28 4 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) 

Есть ли хороший способ справиться с использованием сглаженного ключа, чтобы получить правильное значение в результирующем словаре?


Edit: я понял, что это гораздо проще просто псевдонимы в другом направлении, т.е.

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 
Смежные вопросы