Julia中如何预定义适配特定元组数组类型的容器?
合适的预分配方案:字典优先,数组备选
首先得澄清一点:你的classes是字符串键的字典,如果想保留arr[class]这种通过字符串键直接访问的写法,用字典来预分配arr才是最贴合场景的选择——数组是靠整数索引访问的,没法直接用"Item1"这种字符串当索引。下面给你两种可行的方案:
1. 推荐:预分配同键字典
先给pmap返回的元素类型起个别名,让代码更简洁(也可以直接写完整类型):
# 定义返回的元组类型别名,避免重复写长类型声明 const ResultTuple = Tuple{Float64, Float64, Float64, Vector{Float64}}
接下来有两种预分配字典的方式:
- 方式一:先创建空字典,循环时直接赋值
arr = Dict{String, Vector{ResultTuple}}()
- 方式二:预先为每个
classes的键初始化空数组(如果需要提前占位)
arr = Dict(class => ResultTuple[] for class in keys(classes))
之后你的循环逻辑可以直接沿用:
for class in keys(classes) arr[class] = pmap(y -> func(arg, y), 1:length(arg1), batch_size=Int(round(length(arg)/nworkers()))) end
2. 备选:用数组预分配(需依赖有序键)
如果你确实需要用数组存储,那得先把classes的键转为有序列表,再通过整数索引访问:
const ResultTuple = Tuple{Float64, Float64, Float64, Vector{Float64}} # 先获取排序后的键列表,保证访问顺序固定 sorted_class_keys = sort(collect(keys(classes))) # 预分配数组,长度和classes一致,每个元素是ResultTuple的数组 arr = Vector{Vector{ResultTuple}}(undef, length(sorted_class_keys)) # 循环时用枚举绑定索引和键 for (idx, class) in enumerate(sorted_class_keys) arr[idx] = pmap(y -> func(arg, y), 1:length(arg1), batch_size=Int(round(length(arg)/nworkers()))) end
为什么你之前的数组定义行不通?
你想定义的Array{Array{Tuple{...},1},1}是一个数组的数组,它只能通过整数索引(比如arr[1])访问元素,没办法用"Item1"这种字符串键。而你的循环逻辑里是用class(字符串)作为索引,这就和数组的访问方式不匹配了——这也是为什么推荐用字典的核心原因。
内容的提问来源于stack exchange,提问作者Sameeresque
相关产品推荐
相关产品推荐

