Julia 中的dict.keys的意外行为

Julia 中的dict.keys的意外行为,julia,Julia,为了更快地控制冲突,我创建了dict,它被用作来自对象数组T2的稀疏数组。 但这是一个例外 KeyError:找不到键[142、69、77] 这是我的代码: Ans=Dict{T1,Vector{T2}}() for i in L pos=pos_func(i) if (pos in Ans.keys) push!(Ans[pos],i) else Ans[pos]=Vector{T2}([i]) end end 我捕获事件并打印

为了更快地控制冲突,我创建了dict,它被用作来自对象数组T2的稀疏数组。 但这是一个例外

KeyError:找不到键[142、69、77]

这是我的代码:

Ans=Dict{T1,Vector{T2}}()
for i in L
    pos=pos_func(i)
    if (pos in Ans.keys)
        push!(Ans[pos],i)
    else
        Ans[pos]=Vector{T2}([i])
    end
end
我捕获事件并打印pos、Ans.keys和(Ans.keys中的pos)。我发现pos是Ans.key中的一个,并且(Ans.key中的pos)==True。但无论如何,我无法获得Ans[pos]

Julia版本1.4.0提交b8e9a9ecc6(2020-03-21 16:36 UTC) 这种行为的原因是什么?为什么相同的代码可以工作一半

您应该使用该函数来获取字典的键,而不是访问
字段。(注意,在大多数情况下,访问Julia对象的内部字段不是一个好主意,尤其是当存在访问器方法时)

在测试给定的键是否出现在
Dict
中的特定情况下,使用将更加自动化

以下方面应起作用:

# Some definitions so that your example is runnable
julia> T1 = Int;
julia> T2 = Int;
julia> L = 1:10;
julia> pos_func(i) = i%3;

julia> Ans=Dict{T1,Vector{T2}}()
Dict{Int64,Array{Int64,1}} with 0 entries

julia> for i in L
           pos=pos_func(i)
           if haskey(Ans, pos) # <- keys(Ans) instead of Ans.keys
               push!(Ans[pos],i)
           else
               Ans[pos] = T2[i] # or maybe simply [i], unless your collection L is heterogeneous
           end
       end

julia> Ans
Dict{Int64,Array{Int64,1}} with 3 entries:
  0 => [3, 6, 9]
  2 => [2, 5, 8]
  1 => [1, 4, 7, 10]
#一些定义使您的示例可以运行
julia>T1=Int;
julia>T2=Int;
julia>L=1:10;
julia>pos_func(i)=i%3;
julia>Ans=Dict{T1,向量{T2}()
具有0条目的Dict{Int64,数组{Int64,1}}
朱莉娅>我在洛杉矶
pos=pos_func(i)
如果haskey(Ans,pos)#Ans
具有3个条目的Dict{Int64,数组{Int64,1}}:
0 => [3, 6, 9]
2 => [2, 5, 8]
1 => [1, 4, 7, 10]

发布代码示例时,请确保它们完全可运行。例如,在这种情况下:
T1
T2
L
pos\u func
缺失。我建议不要将变量命名为
Ans
:通常用小写字母缩写Julia命名变量,而
ans
的特殊之处在于它将最后一个结果存储在REPL中。我认为
haskey(ans,pos)
是这里的首选习惯用法。你说得对,谢谢!我编辑了我的答案来提到这一点。