知っていて当たり前-13　辞書型

# 知っていて当たり前-13　辞書型

## 1.　空の辞書


```julia
dic = Dict()
```




    Dict{Any, Any}()



## 2.　辞書の定義法


```julia
dic = Dict("a" => 1, "foo" => "bar")
```




    Dict{String, Any} with 2 entries:
      "a"   => 1
      "foo" => "bar"



## 3.　キーで値を取り出す


```julia
dic["a"] # 名前で取り出す
```




    1




```julia
dic[:"foo"] # シンボルで取り出す
```




    "bar"



## 4.　キーが存在するか（定義されているか） `haskey()`


```julia
haskey(dic, "a")
```




    true



## 5.　キーの一覧 `keys()`


```julia
keys(dic)
```




    KeySet for a Dict{String, Any} with 2 entries. Keys:
      "a"
      "foo"



## 6.　値の一覧 `values()`


```julia
values(dic)
```




    ValueIterator for a Dict{String, Any} with 2 entries. Values:
      1
      "bar"



### 6.1.　要素の追加


```julia
dic["b"] = 999;
dic["foo2"] = "bar2";
dic
```




    Dict{String, Any} with 4 entries:
      "b"    => 999
      "foo2" => "bar2"
      "a"    => 1
      "foo"  => "bar"



## 7.　要素の削除 `delete!()`

戻り値は削除された後の辞書


```julia
x = delete!(dic, "a")
x
```




    Dict{String, Any} with 3 entries:
      "b"    => 999
      "foo2" => "bar2"
      "foo"  => "bar"




```julia
dic # 戻り値と同じ（インプレースで処理された）
```




    Dict{String, Any} with 3 entries:
      "b"    => 999
      "foo2" => "bar2"
      "foo"  => "bar"



## 8.　要素のポップ（削除） `pop!()`

戻り値はポップされた値。変数に代入されなければ捨てられるだけ。


```julia
x = pop!(dic, "b")
dic
```




    Dict{String, Any} with 2 entries:
      "foo2" => "bar2"
      "foo"  => "bar"




```julia
x
```




    999



## 9.　マージ（混ぜ合わせ）

### 9.1.　`merge()`

`merge()` の場合，戻り値はマージされた辞書。同じキーがある場合，後者の値が有効になる。


```julia
a = Dict("foo" => 0.0, "bar" => 42.0);
b = Dict("baz" => 17, "bar" => 4711);
```


```julia
merge(a, b)
```




    Dict{String, Float64} with 3 entries:
      "bar" => 4711.0
      "baz" => 17.0
      "foo" => 0.0




```julia
merge(b, a)
```




    Dict{String, Float64} with 3 entries:
      "bar" => 42.0
      "baz" => 17.0
      "foo" => 0.0



### 9.2.　`merge!()`

`merge!()` の場合，戻り値はマージされた第 1 引数の辞書。第 1 引数はインプレースでマージされる。同じキーがある場合，後者の値が有効になる。第 2 引数の辞書は不変。


```julia
x = merge!(a, b)
a
```




    Dict{String, Float64} with 3 entries:
      "bar" => 4711.0
      "baz" => 17.0
      "foo" => 0.0




```julia
x
```




    Dict{String, Float64} with 3 entries:
      "bar" => 4711.0
      "baz" => 17.0
      "foo" => 0.0




```julia
b
```




    Dict{String, Int64} with 2 entries:
      "bar" => 4711
      "baz" => 17



### 9.3.　`mergewith()`

マージされる辞書に同じキーのものがある場合，値は両方の値を第 1 引数で演算したものになる。

下の例で `"bar"` は 42.0 + 47.11 の 4753.0 になる。


```julia
a = Dict("foo" => 0.0, "bar" => 42.0);
b = Dict("baz" => 17, "bar" => 4711);
```


```julia
x = mergewith(+, a, b)
x
```




    Dict{String, Float64} with 3 entries:
      "bar" => 4753.0
      "baz" => 17.0
      "foo" => 0.0



### 9.4.　`mergewith!()`

`mergewith()` と同じであるが，第 2 引数はインプレースで処理される。戻り値は処理後の第 2 引数と同じ。第 3 引数は不変。


```julia
a = Dict("foo" => 0.0, "bar" => 42.0);
b = Dict("baz" => 17, "bar" => 4711);
```


```julia
x = mergewith!(+, a, b)
a
```




    Dict{String, Float64} with 3 entries:
      "bar" => 4753.0
      "baz" => 17.0
      "foo" => 0.0




```julia
x
```




    Dict{String, Float64} with 3 entries:
      "bar" => 4753.0
      "baz" => 17.0
      "foo" => 0.0




```julia
b
```




    Dict{String, Int64} with 2 entries:
      "bar" => 4711
      "baz" => 17



## 10.　空か？ `isempty()`


```julia
isempty(dic)
```




    false



## 11.　長さ `length()`


```julia
length(dic)
```




    2



## 12.　空にする `empty!()`


```julia
empty!(dic)
```




    Dict{String, Any}()




```julia
isempty(dic)
```




    true