首先,如果您知道中间列表始终有3个元素,那么最好使用Tuple
类型 。而且,元组可以独立指定其元素的类型。因此,下面的代码可能适合您的需求:
julia> l = [(Int64[], Int64[], Float64[]) for _ in 1:10]
10-element Array{Tuple{Array{Int64,1},Array{Int64,1},Array{Float64,1}},1}:
([], [], [])
([], [], [])
([], [], [])
([], [], [])
([], [], [])
([], [], [])
([], [], [])
([], [], [])
([], [], [])
([], [], [])
julia> push!(l[1][3], 5)
1-element Array{Float64,1}:
5.0
julia> l
10-element Array{Tuple{Array{Int64,1},Array{Int64,1},Array{Float64,1}},1}:
([], [], [5.0])
([], [], [])
([], [], [])
([], [], [])
([], [], [])
([], [], [])
([], [], [])
([], [], [])
([], [], [])
([], [], [])
以下是一些值得注意的细节:
使用T[]
可以构建元素为空但类型已定义的列表,其中T
为元素类型。
collect(f(i) for i in 1:n)
本质上等同于一个简单的推导式(就像你在Python中所用的): [f(i) for i in 1:n]
。请注意,由于变量i
在这里没有任何作用,您可以将其替换为一个下划线占位符,以便读者更直观地看出您实际上正在创建类似对象的集合(但不相同,因为它们不共享相同的底层内存; 修改一个不会影响其他对象)。
我不知道有什么更好的方法来初始化这样的集合,并且我不认为在这里使用collect
(或推导式)是一个坏主意。对于相同对象的集合,fill
提供了一个有用的快捷方式,但在这里它不适用,因为所有子列表都将被链接起来。
如果所有内部子列表具有相同的长度,您可能想切换到稍微不同的数据结构:一个元组向量的向量:
julia> l2 = [Tuple{Int64,Int64,Float64}[] for _ in 1:10]
10-element Array{Array{Tuple{Int64,Int64,Float64},1},1}:
[]
[]
[]
[]
[]
[]
[]
[]
[]
[]
julia> push!(l2[2], (1,2,pi))
1-element Array{Tuple{Int64,Int64,Float64},1}:
(1, 2, 3.141592653589793)
julia> l2
10-element Array{Array{Tuple{Int64,Int64,Float64},1},1}:
[]
[(1, 2, 3.141592653589793)]
[]
[]
[]
[]
[]
[]
[]
[]