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中基本的数据结构。

猜你喜欢

转载自juejin.im/post/5b78d6e3f265da43741e0b55
今日推荐