Трансляция алгебраических операций между диктовками - PullRequest
0 голосов
/ 03 сентября 2018

У меня есть два дикта, и я хочу вычесть совпадающие значения из двух диктов, чтобы сгенерировать третий диктов.

A = Dict("w" => 2, "x" => 3)
B = Dict("x" => 5, "w" => 7)
# Ideally I could go B .- A and get a dict like 
C = Dict("w" => 5, "x" => 2)
# but I get ERROR: ArgumentError: broadcasting over dictionaries and `NamedTuple`s is reserved

Одним из уродливых решений является перегрузка оператора вычитания, но я не хочу перегружать встроенный тип, такой как dict, из-за боязни взломать другой код.

import Base.-
function -(dictA::Dict, dictB::Dict)
   keys_of_A = keys(dictA)
   subtractions = get.(Ref(dictB), keys_of_A, 0) .- get.(Ref(dictA), keys_of_A, 0)
   return Dict(keys_of_A .=> subtractions)
end

Есть ли более чистый способ выполнения алгебраических операций при сопоставлении значений из разных диктов?

1 Ответ

0 голосов
/ 03 сентября 2018

merge обеспечивает желаемый результат.

A = Dict("w" => 2, "x" => 3)
B = Dict("x" => 5, "w" => 7)
C = merge(-, B, A)

Dict{String,Int64} with 2 entries:
  "w" => 5
  "x" => 2

Обратите внимание, что merge выполняет объединение двух коллекций и объединяет общие ключи, выполняя данную операцию. Так, например:

W = Dict("w" => 4)
merge(-, B, W)

Dict{String,Int64} with 2 entries:
  "w" => 3
  "x" => 5
...