Julia 言語の名前付きタプル (Core.NamedTuple) は、名前と順序を持つコレクションです。配列や集合など他のコレクションとの違いや、名前付きタプルの使い方をご紹介します。
Core.NamedTuple はコレクションの一種である。Julia 言語には、以下に示すコレクションがある。
コレクション | 順序 | 名前 | 値の重複 | 要素の追加・変更 |
---|---|---|---|---|
Core.Array | ✓ | ✗ | ✓ | ✓ |
Core.NamedTuple | ✓ | ✓ | ✓ | ✗ |
Core.Tuple | ✓ | ✗ | ✓ | ✗ |
Base.Dict | ✗ | ✓ | ✓ | ✓ |
Base.Matrix | ✓ | ✗ | ✓ | ✓ |
Base.Set | ✗ | ✗ | ✗ | ✗ |
Base.Vector | ✓ | ✗ | ✓ | ✓ |
Core.NamedTuple は以下に示す特徴を持つ。
上記の特徴を持つコレクションは、一般的に「名前付きタプル」と呼ばれる。
名前付きタプルの生成方法を以下に示す。
julia> x = (a = 1, b = 2.0, c = "foo")
(a = 1, b = 2.0, c = "foo")
Core.NamedTuple の値は、1 から始まる番号又は名前を指定して参照できる。
julia> x = (a = 1, b = 2.0, c = "foo")
(a = 1, b = 2.0, c = "foo")
julia> x[1]
1
julia> x.b
2.0
julia> x[:c]
"foo"
Core.NamedTuple は先頭から順に値を取り出すことができる。
julia> x = (a = 1, b = 2.0, c = "foo")
(a = 1, b = 2.0, c = "foo")
julia> for i in x
println(i)
end
1
2.0
foo
Core.NamedTuple のイテレーションで取り出せるのは値だけであり、名前は取り出せない。名前と値のペアを取り出したい場合は、Base.pairs 関数を使う。
julia> x = (a = 1, b = 2, c = 3)
(a = 1, b = 2, c = 3)
julia> for i in pairs(x)
println(i)
end
:a => 1
:b => 2
:c => 3
名前付きタプルの値を変更することはできない。
julia> x = (a = 1, b = 2)
(a = 1, b = 2)
julia> x.a = 0
ERROR: setfield!: immutable struct of type NamedTuple cannot be changed
名前付きタプルに値を追加することはできない。
julia> x = (a = 1, b = 2)
(a = 1, b = 2)
julia> x.c = 0
ERROR: type NamedTuple has no field c
Core.typeof 関数を使って、名前付きタプル内の要素の型を確認できる。
julia> x = (a = 1, b = 2.0, c = "foo")
(a = 1, b = 2.0, c = "foo")
julia> typeof(x)
NamedTuple{(:a, :b, :c),Tuple{Int64,Float64,String}}
Base.empty! 関数を使って、名前付きタプルの要素を空にすることはできない。
julia> x = (a = 1)
1
julia> empty!(x)
ERROR: MethodError: no method matching empty!(::Int64)
Base.findall メソッドを使うことで、Core.NamedTuple に含まれる true の要素だけを抽出することができる。
julia> nt = (a = true, b = false)
(a = true, b = false)
julia> findall(nt)
1-element Vector{Symbol}:
:a
Base.findall メソッドを使うことで、Core.NamedTuple に含まれる要素のうち、引数に渡した関数の戻り値が true になる要素だけを抽出することができる。
julia> nt = (a = 1, b = 2, c = 3, d = 4)
(a = 1, b = 2, c = 3, d = 4)
julia> findall(isodd, nt)
2-element Vector{Symbol}:
:a
:c
julia> findall(iseven, nt)
2-element Vector{Symbol}:
:b
:d
Base.isempty 関数を使って、名前付きタプルが空かどうかを確認できる。
julia> x = (a = 1, b = 2)
(a = 1, b = 2)
julia> isempty(x)
false
Base.length 関数を使って、名前付きタプルの要素数を確認できる。
julia> x = (a = 1, b = 2, c = 3)
(a = 1, b = 2, c = 3)
julia> length(x)
3
Base.sum 関数を使って、Core.NamedTuple 各要素の合計値を求めることができる。
julia> sum((x = 1, y = 2, z = 3))
6
JuliaLang.org contributors 2023. Julia Documentation