неожиданное поведение dict.keys на в - PullRequest
1 голос
/ 05 апреля 2020

для более быстрого контроля коллизий я создаю 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

I поймал событие и напечатал pos, Ans.keys и (pos в Ans.keys). Я обнаружил, что pos это один из Ans.keys и (pos в Ans.keys) == True. Но в любом случае я не могу получить Ans [pos].

Julia Version 1.4.0 Commit b8e9a9ecc6 (2020-03-21 16:36 UT C) В чем причина такого поведения? Почему один и тот же код может работать в полтора раза?

1 Ответ

2 голосов
/ 05 апреля 2020

Вы должны использовать функцию keys(), чтобы получить ключи вашего словаря вместо доступа к полю keys. (Обратите внимание, что в большинстве случаев не очень удобно обращаться к внутренним полям объектов Julia, особенно когда существуют методы доступа).

И в частном случае проверки того, появляется ли данный ключ в Dict, с использованием haskey() будет еще больше idomati c.

Следующее должно работать:

# 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]
...