代码之家  ›  专栏  ›  技术社区  ›  The Unfun Cat

juliadefaultdict对每个键使用相同的值(数组)

  •  1
  • The Unfun Cat  · 技术社区  · 6 年前

    我想创建一个数组的defaultdict。问题是,它对每个键使用相同的数组。

    # using Pkg
    # Pkg.add("DataStructures")
    using DataStructures: DefaultDict
    genome = DefaultDict{Tuple{String, String}, Array{Int64, 1}}(Int64[])
    push!(genome["chr1", "+"], 5)
    # 1-element Array{Int64,1}:
    # 5
    
    push!(genome["chrX", "-"], 10)
    # 2-element Array{Int64,1}:
    #  5
    # 10
    

    我试着给它一个lambda来创建一个新的数组 x -> Int64 ,但这只是给出了一个类型错误。

    2 回复  |  直到 6 年前
        1
  •  2
  •   phipsgabler    6 年前

    x -> Int64 ,那么这就没有意义了:initilizer不需要参数,它应该返回一个值,而不是一个类型。你可能想用的是 () -> Int64[] :

    julia> genome = DefaultDict{Tuple{String, String}, Array{Int64, 1}}(() -> Int64[])
    DefaultDict{Tuple{String,String},Array{Int64,1},getfield(Main, Symbol("##7#8"))} with 0 entries
    
    julia> genome["a", "b"]
    0-element Array{Int64,1}
    
    julia> push!(genome["a", "c"], 5)
    1-element Array{Int64,1}:
     5
    
    julia> genome
    DefaultDict{Tuple{String,String},Array{Int64,1},getfield(Main, Symbol("##7#8"))} with 2 entries:
      ("a", "c") => [5]
      ("a", "b") => Int64[]
    
    julia> push!(genome["a", "b"], 4)
    1-element Array{Int64,1}:
     4
    
    julia> genome
    DefaultDict{Tuple{String,String},Array{Int64,1},getfield(Main, Symbol("##7#8"))} with 2 entries:
      ("a", "c") => [5]
      ("a", "b") => [4]
    

    如果要基于尝试过的键创建默认值,可以使用 passkey = true 以及一个以键为参数的初始化函数;看见 the docs 所有选项。

        2
  •  4
  •   hjab    6 年前

    get!(collection, key, default)
    

    genome = Dict{Tuple{String, String}, Array{Int64, 1}}()
    push!(get!(genome, ("chr1", "+"), Int64[]), 5)
    # 1-element Array{Int64,1}:
    # 5
    
    push!(get!(genome, ("chrX", "-"), Int64[]), 10)
    # 1-element Array{Int64,1}:
    # 10