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

Julia DefaultDict uses the same value (array) for each key

我想创建一个数组的 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,但这只是给出了一个类型错误。

我不知道如何使用 DefaultDict 解决您的问题,但我认为 Julia 的内置字典结构提供了更好的解决方案。一个可以用

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

如果您按字面意思使用 x -> Int64,那么这没有意义:您的启动器不需要参数,它应该 return 一个值,而不是一个类型。您可能想要使用的是 () -> 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