Julia——基本数据结构
预知
这篇文章能被您看到令我很开心,但有些话我必须提前告知您,以免浪费您的时间。
这仅仅是本人的学习笔记,非常粗浅和凌乱,不深入浅出,也不确定未来是否还会对其继续更新。此文仅适合您用来速览或消磨时间,内容大体上适合顺序阅读,如有必要,欢迎您联系我交流。
Julia中涵盖的基本数据结构如下,本文按此顺序介绍:
元组
字典
数组
元组
将有序的元素集合用括号包裹生成元组,中间用逗号隔开,基本用法与Python没什么不同。
Syntax:
(item1, item2, ...) 复制代码
实例如下:
myfavoriteanimals = ("penguins", "cats", "sugargliders") # ("penguins", "cats", "sugargliders") myfavoriteanimals[1] # "penguins" myfavoriteanimals[1] = "otters" # 元组是不可变的,无法更新数据 # ERROR: MethodError: no method matching setindex!(::Tuple{String,String,String}, ::String, ::Int64) 复制代码
与Python不同的是,Julia进行了拓展(1.0版本及以上),元组中的分量可以被命名:
myfavoriteanimals = (bird = "penguins", mammal = "cats", marsupial = "sugargliders") # (bird = "penguins", mammal = "cats", marsupial = "sugargliders") myfavoriteanimals[1] # "penguins" myfavoriteanimals.bird # "penguins" 复制代码
字典
创建字典需要通过內建的Dict()
函数,函数的参数可以是空或者键值对,键值对需要使用箭头符号=>
进行关联。
Syntax:
Dict(key1 => value1, key2 => value2, ...) 复制代码
实例如下:
myphonebook = Dict("Jenny" => "867-5309", "Ghostbusters" => "555-2368") # Dict{String,String} with 2 entries: # "Jenny" => "867-5309" # "Ghostbusters" => "555-2368" myphonebook["Jenny"] # "867-5309" myphonebook["Kramer"] = "555-FILK" # "555-FILK" myphonebook # Dict{String,String} with 3 entries: # "Jenny" => "867-5309" # "Kramer" => "555-FILK" # "Ghostbusters" => "555-2368" 复制代码
将键Kramer
从字典中删除,返回值为键Kramer
对应的值:
pop!(myphonebook, "Kramer") # "555-FILK" myphonebook # Dict{String,String} with 2 entries: # "Jenny" => "867-5309" # "Ghostbusters" => "555-2368" 复制代码
不同于元组与数组,字典中的元素是没有先后之分的,无法通过数字进行索引,在下面的例子中,Julia会尝试取键为"1"时对应的值:
myphonebook[1] # KeyError: key 1 not found 复制代码
数组
数组与元组均包含有序集合,但数组可以被更新,使用中括号区分数组与元组,基本用法同样与Python相同:
Syntax:
[item1, item2, ...] 复制代码
myfriends = ["Ted", "Robyn", "Barney", "Lily", "Marshall"] # 5-element Array{String,1}: # "Ted" # "Robyn" # "Barney" # "Lily" # "Marshall" 复制代码
返回提示中:
5-element
说明数组内的元素总数为5Array{String,1}
表明当前是一个数组String
表明数组内的每个元素都是String
类型,如果数组中有多种数据类型,这里会显示any
1
表明这是一个一维向量,如果为二维矩阵,则为Array{String,2}
,三维为Array{String,3}
,以此类推,Julia在展示多维数组的维度信息方面比Python易懂很多,后续会看到。
Julia有很多地方与Python也完全不同,比如从1开始索引,或许后边会少些麻烦,但谁知道呢,你懂的。
myfriends[0] # ERROR: BoundsError: attempt to access 5-element Array{String,1} at index [0] myfriends[1] # "Ted" 复制代码
再比如在数字数组中追加一个字符串,在Python中轻松做到:
a = [1,2,3] a.append("1") print(a) # [1, 2, 3, '1'] 复制代码
但在Julia中,可没有那么自由,如果在字符串数组myfriends
中插入数字,就会报错:
push!(myfriends, 1) # ERROR: MethodError: Cannot `convert` an object of type Int64 to an object of type String 复制代码
但如果一开始就新建一个包含元素为Any
的数组,则可以完成任意类型的插入:
a = [1,2,3,"3"] # 4-element Array{Any,1}: # 1 # 2 # 3 # "3" pop!(a) # "3" a # 看下面,返回信息中提示当前数组内允许Any类型的数据存在 # 3-element Array{Any,1}: # 1 # 2 # 3 push!(a, "1") # 5-element Array{Any,1}: # 1 # 2 # 3 # "1" 复制代码
Julia中数组的维度信息比Python多很多,下面创建了一个二维数组:
favorites = [["koobideh", "chocolate", "eggs"],["penguins", "cats", "sugargliders"]] # 2-element Array{Array{String,1},1}: # ["koobideh", "chocolate", "eggs"] # ["penguins", "cats", "sugargliders"] 复制代码
外层的
2-element Array{...}
表明最外一层包含两个元素,所包含的元素都是Array{String,1}
类型,1
表示最外层维度为1.上面提到外层所包含的每个元素都是
Array{String,1}
类型,1
表示它们都是1维向量,元素个数没有告知,但元素类型都是String
。
numbers = [[[1], [2], [3]], [[4], [5]]] # 2-element Array{Array{Array{Int64,1},1},1}: # [[1], [2], [3]] # [[4], [5]] 复制代码
上面的例子则展示了一个三维数组,每一个维度内的元素个数并不需要相同。julia与Python中一样,默认情况下都是浅拷贝,如果想要进行深拷贝,可以直接使用內建的copy
函数:
a = [1,2,3] # 3-element Array{Int64,1}: # 1 # 2 # 3 b = a # 浅拷贝 # 3-element Array{Int64,1}: # 1 # 2 # 3 b[1] = 111 # 111 a,b # ([111, 2, 3], [111, 2, 3]) c = copy(a) # 深拷贝 # 3-element Array{Int64,1}: # 111 # 2 # 3 c[1] = 1 # 1 a, b ,c # ([111, 2, 3], [111, 2, 3], [1, 2, 3]) 复制代码
以上是Julia中基本的数据结构。
作者:haoxiangchn
来源:掘金