Julia - 将元素添加到特定类型的列表中

时间:2016-11-17 09:30:07

标签: julia

有没有办法自动添加到任意类型的列表,该类型的新元素

我的问题是,我有一个字典,有一些键,每个值都是一个数组,所有数组的长度相同

a = Dict
    x = [1,2,3]
    y = ["a", "b", "c"]
    z = [Dict(filled with stuff), Dict(also filled), Dict(filled)]

问题是,我需要使用中性添加a的每个元素,fx我需要进行一轮填充会导致

a = Dict
    x = [1,2,3,0]
    y = ["a", "b", "c", " "]
    z = [Dict(filled with stuff), Dict(also filled), Dict(filled), Dict()]

但是a并不总是像这样结构化,xyz可能很容易都是整数,浮点数或任何可想象的混合数组< / p>

tl; dr 我可以push!()以某种自动的方式将数组中的 basic 元素保存到数组中吗?所以如果数组定义为Array{T},我可以自动追加类型T

简要说明

我的文件包含一些始终存在的标准变量,但也会有其他数据,但这些附加数据会有所不同,但它们的共同点是,所有变量都可以分组为长度,有些变量将是长度为95的数组,有些长度为72等,这就是它们的分组方式。所有附加数组都将放在字典中,但如果添加数据,我希望字典自动扩展,以便长度仍然匹配

1 个答案:

答案 0 :(得分:2)

一般来说,不清楚某种类型的中性值是什么。因此,您必须为每种类型定义自己的函数,例如,像您为String s建议的那样:

neutral(::Type{String}) = " "

对于Number,您可以使用内置的zero函数:

neutral{T<:Number}(::Type{T}) = zero(T)

Dict的中性元素有点复杂:

neutral{T<:Dict}(::Type{T}) = T()
neutral{V}(::Type{Dict{TypeVar(:K),V}}) = Dict{Any, V}()
neutral{K}(::Type{Dict{K}}) = Dict{K, Any}()

作为后备,您仍然可以在评论中使用空字符串:

neutral(x) = ""

最后,您可以定义一个函数将中性元素推送到数组:

push_neutral!{T}(a::AbstractArray{T}) = push!(a, neutral(T))

例如:

push_neutral!([Dict(1=>2), Dict("1"=>2)])
3-element Array{Dict{K,Int64},1}:
 Dict(1=>2)       
 Dict("1"=>2)     
 Dict{Any,Int64}()

这也证明了对Dict的三种不同方法的需求。由于参数K显示的混合类型,只有三个定义中的第一个是不够的。

修改:将此功能应用于保存所有Dict的{​​{1}} a,可以通过以下方式完成:

Array

Edit2:专业版

foreach(push_neutral!, values(a))

似乎没必要。

Edit3:neutral{K, V}(::Type{Dict{K, V}}) = Dict{K, V}() 可能是解决您问题的更好方法。但是,在当前版本中使用它仍然有点困难。