本文要介绍的数据结构类型有:字典、元组和数组。元组和数组中的数据是有顺序的,可以被索引。字典和数组的元素是可变的,元组不可以
字典
如果我们有一组彼此相互关联的数据,例如人名和电话,可以选择字典来存储这些数据
my_phone_book = Dict("Jenny" => "867-5309", "Pen" => "123-2546")
Dict{String,String} with 2 entries:
“Jenny” => “867-5309”
“Pen” => “123-2546”
我们可以为字典添加元素
my_phone_book["Kramer"] = "555-FIKL"
“555-FIKL”
现在来检查一下我们的电话本有哪些人
my_phone_book
Dict{String,String} with 3 entries:
“Jenny” => “867-5309”
“Pen” => “123-2546”
“Kramer” => “555-FIKL”
在这个例子中每一对名字和对应号码是一个键值对。我很可以通过键(key)查找对应的值(value)
my_phone_book["Pen"]
“123-2546”
使用pop!()
函数可以读取Kramer的电话号码同时将他从电话本中删除
pop!(my_phone_book, "Kramer")
“555-FIKL”
my_phone_book
Dict{String,String} with 2 entries:
“Jenny” => “867-5309”
“Pen” => “123-2546”
和元组、数组不同,字典是元素是没有顺序的。所以字典不能使用索引
my_phone_book[0]
KeyError: key 0 not found
Stacktrace:
[1] getindex(::Dict{String,String}, ::Int64) at ./dict.jl:467
[2] top-level scope at In[9]:1
[3] include_string(::Function, ::Module, ::String, ::String) at ./loading.jl:1091
[4] execute_code(::String, ::String) at /home/peng/.julia/packages/IJulia/a1SNk/src/execute_request.jl:27
[5] execute_request(::ZMQ.Socket, ::IJulia.Msg) at /home/peng/.julia/packages/IJulia/a1SNk/src/execute_request.jl:86
[6] #invokelatest#1 at ./essentials.jl:710 [inlined]
[7] invokelatest at ./essentials.jl:709 [inlined]
[8] eventloop(::ZMQ.Socket) at /home/peng/.julia/packages/IJulia/a1SNk/src/eventloop.jl:8
[9] (::IJulia.var"#15#18")() at ./task.jl:356
元组
我们可以使用括号()
创建数组
my_favorite_animals = ("penguins", "cats", "sugargliders")
(“penguins”, “cats”, “sugargliders”)
元组可以被索引
my_favorite_animals[1]
“penguins”
因为元组不能更改,我们不能通过下面的方法更新元组的元素
my_favorite_animals[1] = "otters"
MethodError: no method matching setindex!(::Tuple{String,String,String}, ::String, ::Int64)
Stacktrace:
[1] top-level scope at In[18]:1
[2] include_string(::Function, ::Module, ::String, ::String) at ./loading.jl:1091
[3] execute_code(::String, ::String) at /home/lupeng/.julia/packages/IJulia/a1SNk/src/execute_request.jl:27
[4] execute_request(::ZMQ.Socket, ::IJulia.Msg) at /home/lupeng/.julia/packages/IJulia/a1SNk/src/execute_request.jl:86
[5] #invokelatest#1 at ./essentials.jl:710 [inlined]
[6] invokelatest at ./essentials.jl:709 [inlined]
[7] eventloop(::ZMQ.Socket) at /home/lupeng/.julia/packages/IJulia/a1SNk/src/eventloop.jl:8
[8] (::IJulia.var"#15#18")() at ./task.jl:356
数组
和元组不同,数组的元素是可以更改的。数组元素是有序的可以被索引
定义数组使用[]
myfriends = ["Ted", "Robyn", "Barney", "Lily", "Marshall"]
5-element Array{String,1}:
“Ted”
“Robyn”
“Barney”
“Lily”
“Marshall”
fibonacci = [1, 1, 2, 3, 5, 8, 13]
7-element Array{Int64,1}:
1
1
2
3
5
8
13
mix = [1, 2, "hi"]
3-element Array{Any,1}:
1
2
“hi”
当有一个数组时,可以对其进行索引。例如,如果我们想看看myfriend中第三个朋友是谁,可以使用下面的语句
myfriends[3]
“Barney”
我们可以使用索引更新数组已有的元素
myfriends[3] = "Baby Bop"
“Baby Bop”
myfriends
5-element Array{String,1}:
“Ted”
“Robyn”
“Baby Bop”
“Lily”
“Marshall”
我们也可以使用push!
和pop!
函数操作数组。push!
可以在数组的最后面添加一个元素,而pop!
可以移除数组最后的元素。
我们可以在fibonacci数组后面再加一个数
push!(fibonacci, 21)
8-element Array{Int64,1}:
1
1
2
3
5
8
13
21
接着删除它
pop!(fibonacci)
21
fibonacci
7-element Array{Int64,1}:
1
1
2
3
5
8
13
到目前为止我们使用的例子都是一维数组,其实数组可以是任意维数,数组还可以存储数组。
看看下面的例子
favorites = [["koobideh", "chocolate", "eggs"], ["penguins", "cats", "sugargliders"]]
2-element Array{Array{String,1},1}:
[“koobideh”, “chocolate”, “eggs”]
[“penguins”, “cats”, “sugargliders”]
numbers = [[1, 2, 3], [4, 5], [6, 7, 8, 9]]
3-element Array{Array{Int64,1},1}:
[1, 2, 3]
[4, 5]
[6, 7, 8, 9]
下面的例子时使用rand
函数生成2维和3维随机数组
rand(4, 3)
4×3 Array{Float64,2}:
0.476972 0.291616 0.184351
0.408506 0.424616 0.869187
0.375841 0.78145 0.957232
0.898244 0.987455 0.239962
rand(4, 3, 2)
4×3×2 Array{Float64,3}:
[:, :, 1] =
0.221435 0.623564 0.739904
0.470641 0.758483 0.575782
0.477899 0.681344 0.155893
0.322675 0.198033 0.0480659[:, :, 2] =
0.509818 0.653145 0.82909
0.503314 0.180191 0.57221
0.658475 0.858585 0.103949
0.970864 0.169177 0.072269