Julia 中的dict.keys的意外行为
为了更快地控制冲突,我创建了dict,它被用作来自对象数组T2的稀疏数组。 但这是一个例外 KeyError:找不到键[142、69、77] 这是我的代码: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 我捕获事件并打印
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)
是这里的首选习惯用法。你说得对,谢谢!我编辑了我的答案来提到这一点。