代码之家  ›  专栏  ›  技术社区  ›  isebarn

Julia-向特定类型的列表添加元素

  •  0
  • isebarn  · 技术社区  · 9 年前

    是否有一种方法可以自动向任意类型的列表中添加该类型的新元素

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

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

    问题是,我需要添加到 a 有什么 ,外汇我需要做一轮 填满

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

    一 不会总是这样构造, x , y 和 z 可能很容易都是整数数组、浮点或任何可以想象的混合

    tl;博士 我可以吗 push!() 以某种自动方式将数组 基本的 Array{T} 我可以自动附加类型 T ?

    简要说明

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

    1 回复  |  直到 9 年前
        1
  •  2
  •   tim    9 年前

    通常,不清楚类型的中性值是什么。因此,您必须为每个类型定义自己的函数,例如 String s:

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

    对于 Number zero 功能:

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

    a的中性元素 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}()
    

    字典 .由于参数所示的混合类型 K ,仅这三个定义中的第一个定义是不够的。

    编辑:将此函数应用于 字典 a 持有所有 Array s可以简单地通过以下方式完成:

    foreach(push_neutral!, values(a))
    

    编辑2:专业版

    neutral{K, V}(::Type{Dict{K, V}}) = Dict{K, V}()
    

    似乎没有必要。

    编辑3:A NullableArray 可能是解决您问题的更好方法。然而,在当前版本中使用它仍然有点困难。

    推荐文章