我們都知道要將兩個 Array
接起來要用 append!
,要將兩個 Set
合併起來要用 union!
,但要將 Dict
合併起來要用什麼呢?
答案是 merge!
merge
廢話不多說,我們看範例:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
| julia> a = Dict(:a => "A", :b => "B") Dict{Symbol,String} with 2 entries: :a => "A" :b => "B"
julia> b = Dict(:c => "C", :d => "D") Dict{Symbol,String} with 2 entries: :d => "D" :c => "C"
julia> merge(a, b) Dict{Symbol,String} with 4 entries: :a => "A" :b => "B" :d => "D" :c => "C"
|
merge
可以將兩個 Dict
合併起來,並且產生一個新的 Dict
。
有另一個函式 merge!
可以支援 in-place 版本的合併。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
| julia> a Dict{Symbol,String} with 2 entries: :a => "A" :b => "B"
julia> merge!(a, c) Dict{Symbol,String} with 3 entries: :a => "A" :b => "C" :d => "D"
julia> a Dict{Symbol,String} with 3 entries: :a => "A" :b => "C" :d => "D"
|
重複的鍵(key)
如果要合併的兩個字典當中有重複的鍵出現的話,會發生什麼事呢?
1 2 3 4 5 6 7 8 9 10
| julia> c = Dict(:b => "C", :d => "D") Dict{Symbol,String} with 2 entries: :b => "C" :d => "D"
julia> merge(a, c) Dict{Symbol,String} with 3 entries: :a => "A" :b => "C" :d => "D"
|
答案是會被後者蓋掉。
NamedTuple
merge
也可以用在 NamedTuple 上。
1 2 3 4 5 6 7 8
| julia> a = (a="A", b="B") (a = "A", b = "B")
julia> b = (c="C", d="D") (c = "C", d = "D")
julia> merge(a, b) (a = "A", b = "B", c = "C", d = "D")
|
mergewith (require v1.5 and above)
接下來介紹一個更好用的函式 mergewith。
上面我們介紹的 merge
遇到相同的鍵,會把彼此蓋掉的行為,但有時候我們希望他們可以合併。
不囉唆,我們看範例:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
| julia> a = Dict(:a => 1, :b => 2) Dict{Symbol,Int64} with 2 entries: :a => 1 :b => 2
julia> c = Dict(:b => 3, :d => 4) Dict{Symbol,Int64} with 2 entries: :b => 3 :d => 4
julia> mergewith(+, a, c) Dict{Symbol,Int64} with 3 entries: :a => 1 :b => 5 :d => 4
|
我們可以指定一個 aggregate function,如果遇到相同的鍵時,就把他們的值相加起來。
這個 aggregate function 可以是其他的,如此就可以處理多樣的資料。
mergewith
一樣有 in-place 版本 mergewith!
。
curry function
最神奇的是,mergewith
有類似 curry function 的行為。
1 2 3 4 5 6 7 8
| julia> mergewith(+)(a, c) Dict{Symbol,Int64} with 3 entries: :a => 1 :b => 5 :d => 4
julia> mergewith(+)
|
你可以先給他一個 aggregate function,他會回傳一個匿名函式。
你可以拿這個匿名函式用在其他物件上。