Julia 辞書と集合

前のいくつかの章で学びましたJulia 配列とjulia タプル。

配列は集合の一種ですが、その他にも Julia には辞書や set(順序のない集合リスト)などの他の種類の集合があります。


辞書

辞書は可変なコンテナモデルであり、任意の型のオブジェクトを格納できます。

辞書の各キーと値key=>valueペアを=>区切り、各キーと値のペア間はカンマで,区切り、辞書全体は波括弧で囲みます{}の中に、形式は次の通りです:

辞書の作成

辞書を作成する構文は次の通りです:
Dict("key1" => value1, "key2" => value2,,…, "keyn" => valuen)

次の例では、キー A に対応する値が 1、キー B に対応する値が 2 の単純な辞書を作成します:

Dict("A"=>1, "B"=>2)

実例

julia> D=Dict("A"=>1, "B"=>2)
Dict{String, Int64} with 2 entries:
  "B" => 2
  "A" => 1

julia>

for を使って辞書を作成します:

実例

julia> first_dict = Dict(string(x) => sind(x) for x = 0:5:360)
Dict{String, Float64} with 73 entries:
  "285" => -0.965926
  "310" => -0.766044
  "245" => -0.906308
  "320" => -0.642788
  "350" => -0.173648
  "20"  => 0.34202
  "65"  => 0.906308
  "325" => -0.573576
  "155" => 0.422618
  "80"  => 0.984808
  "335" => -0.422618
  "125" => 0.819152
  "360" => 0.0
  "75"  => 0.965926
  "110" => 0.939693
  "185" => -0.0871557
  "70"  => 0.939693
  "50"  => 0.766044
  "190" => -0.173648
  ⋮     => ⋮

キー(Key)

辞書のキーは一意です。既存のキーに値を割り当てると、新しいキーは作成されず、既存のキーが変更されます。

key を検索

haskey() 関数を使用して、辞書に指定された key が含まれているかどうかを確認できます:

実例

julia> D=Dict("A"=>1, "B"=>2)
Dict{String, Int64} with 2 entries:
  "B" => 2
  "A" => 1

julia> haskey(first_dict, "A")
false

julia> haskey(D, "A")
true

julia> haskey(D, "Z")
false

また、次を使用することもできますin()辞書に次のものが含まれているかどうかを確認する関数キー/値ペア:

実例

julia> D=Dict("A"=>1, "B"=>2)
Dict{String, Int64} with 2 entries:
  "B" => 2
  "A" => 1

julia> in(("A" => 1), D)
true

julia> in(("X" => 220), first_dict)
false

key/value ペアの追加

既存の辞書に新しい key/value ペアを追加できます。次のようにします:

実例

julia> D=Dict("A"=>1, "B"=>2)
Dict{String, Int64} with 2 entries:
  "B" => 2
  "A" => 1

julia> D["C"] = 3
3

julia> D
Dict{String, Int64} with 3 entries:
  "B" => 2
  "A" => 1
  "C" => 3

key/value ペアの削除

私たちは使用できますdelete!()関数を使用して既存の辞書の key を削除します:

実例

julia> delete!(D, "C")
Dict{String, Int64} with 2 entries:
  "B" => 2
  "A" => 1

辞書内のすべての key を取得する

私たちは使用できますkeys()関数を使用して辞書内のすべての key を取得します:

実例

julia> keys(D)
KeySet for a Dict{String, Int64} with 2 entries. Keys:
  "B"
  "A"

julia>

値(Value)

辞書の各キーには対応する値があります。

辞書のすべての値を表示

私たちは使用できますvalues()辞書のすべての値を表示します:

実例

julia> D=Dict("A"=>1, "B"=>2)
Dict{String, Int64} with 2 entries:
  "B" => 2
  "A" => 1

julia> values(D)
ValueIterator for a Dict{String, Int64} with 2 entries. Values:
  2
  1

julia>

辞書を反復可能オブジェクトとして

辞書を反復可能オブジェクトとして使用して、キー/値ペアを表示できます:

実例

julia> D=Dict("A"=>1, "B"=>2)
Dict{String, Int64} with 2 entries:
  "B" => 2
  "A" => 1

julia> for kv in D
         println(kv)
       end  
"B" => 2
"A" => 1

実例ではkv各キー/値ペアを含むタプルです。

辞書のソート

辞書は順序付けられていませんが、sort() 関数を使用して辞書をソートできます:

実例

julia> サンプル_dict = Dict("R" => 100, "S" => 220, "T" => 350, "U" => 400, "V" => 575, "W" => 670)
Dict{String, Int64} with 6 entries:
  "S" => 220
  "U" => 400
  "T" => 350
  "W" => 670
  "V" => 575
  "R" => 100

julia> for key in sort(collect(keys(サンプル_dict)))
         println("$key => $(サンプル_dict[key])")
       end
R => 100
S => 220
T => 350
U => 400
V => 575
W => 670

DataStructures.ji パッケージの SortedDict データ型を使用すると、辞書を常にソートされた状態に保つことができます。

DataStructures パッケージを使用するには、まずそれをインストールする必要があります。REPL の Pkg モードで、add コマンドを使用して SortedDict を追加できます。

REPL に記号を入力します]、入りますpkgモード。

pkg モードに入る

julia> ]               # ] を入力すると pkg モードに入ります

パッケージ追加の構文形式:

add 包名

以下で DataStructures パッケージを追加すると、以降の実例は正常に実行できます:

(@v1.7) pkg> add DataStructures
未登録のパッケージは、url を直接指定できます:
add https://github.com/fredrikekre/ImportMacros.jl

ローカルパッケージ:

add 本地路径/包名.jl

実例

julia> import DataStructures

julia> サンプル_dict = DataStructures.SortedDict("S" => 220, "T" => 350, "U" => 400, "V" => 575, "W" => 670)
DataStructures.SortedDict{String, Int64, Base.Order.ForwardOrdering} with 5 entries:
  "S" => 220
  "T" => 350
  "U" => 400
  "V" => 575
  "W" => 670

julia> サンプル_dict["R"] = 100
100

julia> サンプル_dict
DataStructures.SortedDict{String, Int64, Base.Order.ForwardOrdering} with 6 entries:
  "R" => 100
  "S" => 220
  "T" => 350
  "U" => 400
  "V" => 575
  "W" => 670

Set(集合)

Julia Set(集合)は重複のないオブジェクトデータセットであり、すべての要素は一意です。

以下は、set と他の種類の集合との違いです:

  • set 内の要素は一意です
  • set 内の要素の順序は重要ではありません

set は重複のないリストを作成するために使用されます。

Set(集合)の作成

Set コンストラクタを使用して、次のような集合を作成できます:

実例

julia> var_site = Set()
Set{Any}()

julia> num_primes = Set{Int64}()
Set{Int64}()

julia> var_site = Set{String}(["Google","サンプル","Taobao"])
Set{String} with 3 elements:
  "Google"
  "Taobao"
  "サンプル"
Alternatively we can also use push!() function, as arrays, to add elements in sets as follows −

私たちは使用できますpush!()関数を使用して集合要素を追加します。次のようになります:

実例

julia> push!(var_site, "Wiki")
Set{String} with 4 elements:
  "Google"
  "Wiki"
  "Taobao"
  "サンプル"

私たちは使用できますin()関数を使用して、要素が集合内に存在するかどうかを確認します:

実例

julia> in("サンプル", var_site)
true

julia> in("Zhihu", var_site)
false

よく使う操作

和集合、積集合、差集合は集合に対してよく使う操作であり、これらの操作に対応する関数はunion()、intersect()とsetdiff()。

和集合

2つの集合 A と B のすべての要素を1つにまとめて構成される集合を、集合 A と集合 B の和集合と呼びます。

実例

julia> A = Set{String}(["red","green","blue", "black"])
Set{String} with 4 elements:
  "blue"
  "green"
  "black"
  "red"

julia> B = Set(["red","orange","yellow","green","blue","indigo","violet"])
Set{String} with 7 elements:
  "indigo"
  "yellow"
  "orange"
  "blue"
  "violet"
  "green"
  "red"


julia> union(A, B)
Set{String} with 8 elements:
  "indigo"
  "green"
  "black"
  "yellow"
  "orange"
  "blue"
  "violet"
  "red"

積集合

集合 A と B の積集合は、A にも B にも属するすべての要素を含み、他の要素を含まない集合です。

実例

julia> intersect(A, B)
Set{String} with 3 elements:
  "blue"
  "green"
  "red"

差集合

集合 A と B の差集合は、A に属するが B には属さないすべての要素を含む集合、つまり B と A が重複する要素を取り除いたものです。

実例

julia> setdiff(A, B)
Set{String} with 1 element:
  "black"

辞書と集合のよく使う関数の実例

以下の実例では、辞書でよく使う関数を示していますが、集合でも同様に適用できます:

2つの辞書 dict1 と dict2 を作成します:

実例

julia> dict1 = Dict(100=>"X", 220 => "Y")
Dict{Int64,String} with 2 entries:
 100 => "X"
 220 => "Y"
 
julia> dict2 = Dict(220 => "Y", 300 => "Z", 450 => "W")
Dict{Int64,String} with 3 entries:
 450 => "W"
 220 => "Y"
 300 => "Z"

辞書の和集合:

実例

julia> union(dict1, dict2)
4-element Array{Pair{Int64,String},1}:
 100 => "X"
 220 => "Y"
 450 => "W"
 300 => "Z"
Intersect
julia> intersect(dict1, dict2)
1-element Array{Pair{Int64,String},1}:
 220 => "Y"

辞書の差集合:

実例

julia> setdiff(dict1, dict2)
1-element Array{Pair{Int64,String},1}:
 100 => "X"

辞書のマージ:

実例

julia> merge(dict1, dict2)
Dict{Int64,String} with 4 entries:
 100 => "X"
 450 => "W"
 220 => "Y"
 300 => "Z"

辞書内の最小値を表示:

実例

julia> dict1
Dict{Int64,String} with 2 entries:
 100 => "X"
 220 => "Y"
 
 
julia> findmin(dict1)
("X", 100)
その他の拡張