2014-02-21 2 views
4

Пока я траверс вложенной Dict в Джулию, она дает эту ошибку:Traverse вложенного Dict в Julia-лане

ERROR: access to undefined reference 
in next at dict.jl:567 

Вот код, где вы можете воспроизвести эту ошибку:

a = [0,19620,7291,32633,9,32513,42455,10045,31964,42455,11767,54] 
b = [14318,16405,19,18913,19,8141,18958,12336,7,16588,17358,30] 
d = Dict() 
for aa in a 
    for bb in b 
    if ! haskey(d,aa) 
     d[aa]=Dict() 
    end 
    d[aa][bb] = 0.5 
    end 
end 
for k1 in keys(d) 
    s =0.0    
    for k2 in keys(d[k1]) 
    s+= d[k1][k2] 
    end 
    for k2 in keys(d[k1]) 
    d[k1][k2] = d[k1][k2]/s 
    end 
end 

Пришло если a = [0,1] b = [0,1], он работает нормально.

---- Обновление -----

На самом деле, до тех пор, как массив б имеет 11 различных элементов, то ошибка будет. Кроме того, если

d[k1][k2] = d[k1][k2]/s 

стать

d[k1][k2] = d[k1][k2] * s 

или любые другие операции, ошибка исчезает.

Любые идеи?

ответ

2

Ошибка, вероятно, связана с тем, что вы изменяете содержимое d[k1], пока вы выполняете итерацию через него, поэтому итератор ключа выходит из строя после изменения содержимого. (Почему это происходит только с некоторыми операциями, я не могу сказать.)

Во всяком случае, она может быть исправлена ​​путем изменения проблемного цикла для

for k2 in collect(keys(d[k1])) 
    d[k1][k2] = d[k1][k2]/s 
end 

(я не уверен, что это лучший способ сделать это.)

+0

Кроме того, если массив б имеет только 10 элементов, нет никакой ошибки. В этом случае я все же изменил значение во время итерации. Однако я просто изменяю значение, а не структуру dict, поэтому итератору не должно быть проблем. –