Я ищу хороший лаконичный способ найти подмножество словаря 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)
Тем не менее интересно, если есть способ выполнения задачи из исходного словаря, который является более прямо, чем сначала инвертировать его.
Ваш вопрос меня смущает. Что вы подразумеваете под «псевдонимами» в этом контексте? Если это означает, что я думаю, что это значит, не следует: '' c' и ': d' не ссылаться на разные вещи в' o'? –
Это означает стандартное определение псевдонима. Да, в реальном случае вы не хотели бы ': c' и': d' быть разными значениями. Я привел это в примере, поскольку это проблема, которая может возникнуть, и я заметил в примере, что, поскольку эта часть не определена, я бы взял значение. –
, но тогда ваша проблема некорректна. Нет никакого «правильного значения», если у вас есть противоречие в вашем наборе. –