二、Julia数据结构

本文要介绍的数据结构类型有:字典、元组和数组。元组和数组中的数据是有顺序的,可以被索引。字典和数组的元素是可变的,元组不可以

字典

如果我们有一组彼此相互关联的数据,例如人名和电话,可以选择字典来存储这些数据

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

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值