有没有办法自动添加到任意类型的列表,该类型的新元素
我的问题是,我有一个字典,有一些键,每个值都是一个数组,所有数组的长度相同
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
并不总是像这样结构化,x
,y
和z
可能很容易都是整数,浮点数或任何可想象的混合数组< / p>
tl; dr 我可以push!()
以某种自动的方式将数组中的 basic 元素保存到数组中吗?所以如果数组定义为Array{T}
,我可以自动追加类型T
?
简要说明
我的文件包含一些始终存在的标准变量,但也会有其他数据,但这些附加数据会有所不同,但它们的共同点是,所有变量都可以分组为长度,有些变量将是长度为95的数组,有些长度为72等,这就是它们的分组方式。所有附加数组都将放在字典中,但如果添加数据,我希望字典自动扩展,以便长度仍然匹配
答案 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}()
可能是解决您问题的更好方法。但是,在当前版本中使用它仍然有点困难。