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说明数组内的元素总数为5

  • Array{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
来源:掘金

默认 最新
当前暂无评论,小编等你评论哦!
点赞 评论 收藏
关注