作为通用编程语言,除了数组之外,julia实现了元组、字典、集合等数据结构。
与向量类似,也是一维的数据结构,并且对数据类型无要求,从创建流程来说,向量用方括号创建,元组用圆括号创建,并且支持索引,下标从1开始
x = (1, "a") # (1, "a")
x[1] # 1
x[2] # "a"
x[1]=1 # 报错
除了普通的元组之外,Julia还支持带有键的元组,
y = (; name="micro", age=7) # (name = "micro", age = 7)
带键元组支持两种索引方式,一种是符号索引,一种是点索引,前者更像是字典,后者更像是类
y[:name] # "micro"
y.age # 7
无论是普通元组,还是带有名字的元组,其内部元素都是固定的,不支持修改,这是元组与向量以及字典的区别。
字典就是键值对结构,通过键来索引值,并且内部元素可动态修改
d = Dict("name"=>"micro", "age"=>7)
d["name"] # "micro"
d["age"] = 8 #8
println(d)
# Dict{String, Any}("name" => "micro", "age" => 8)
初学者容易忘记调用Dict
,而写为如下形式
ps = ("name"=>"micro", "age"=>7)
这个ps
其实是一个元组,而其中的元素xx=>yy
则是一个Pair。
ps[1] # "name" => "micro"
typeof(ps[1]) # Pair{String, String}
Pair支持方括号索引,也可以通过first和last来获取元素
ps[1][1] # "name"
last(ps[1]) # "micro"
Julia中的集合,和数学上的集合有个相似的性质,即没有重复元素,可通过函数Set
生成
Set(x) # Set{Any} with 2 elements: "a" 1
Set(y) # Set{Any} with 2 elements: 7 "micro"
Set([1,2,3,3])
#= Set{Int64} with 3 elements:
2
3
1
=#
Julia中为集合提供了计算函数以及运算符
功能 | 函数形式 | 运算符形式 |
---|---|---|
并集 | union(A, B) | A ∪ B |
交集 | intersect(A, B) | A ∩ B |
差集 | setdiff(A, B) | A \ B |
对称差集 | symdiff(A, B) | (A∖B)∪(B∖A) |
判断相等 | issetequal(A, B) | |
判断子集 | issubset(A, B) | A ⊆ B |
在Julia命令行中,这些特殊符号可通过\xxx
然后按下tab键打出,语法与markdown相同
∪ | \cup | ∩ | \cap |
⊆ | \subseteq | ⊈ | \nsubseteq |
⊇ | \supseteq | ⊉ | \nsupseteq |
∈ | \in | ∋ | \ni |
∉ | \notin | ∌ | \nni |
下面做一个简单的测试
A = Set([1,2,3,4,5])
B = Set([2,3,4])
A ∪ B # 5 4 3 2 1
A ∩ B # 4 2 3
3 in A # true
3 ∈ A # true
这些数据结构有一个共性,它们可以快速匹配等号左边的变量,并进行赋值
a,b = x # a=1, b="a"
a,b = d # a = "name" => "micro"; b = "age" => 8
但集合本质上是无序的,所以并不建议用这种方法赋值,比如下面的案例中,A在创建时的顺序明明是1, 2, 3, 4, 5,但对a,b 赋值的结果却是5和4。
a,b = A # a = 5, b = 4