# KeyError when indexing from an OrderedDict in for loop

**URL:** <https://discourse.julialang.org/t/keyerror-when-indexing-from-an-ordereddict-in-for-loop/58731>\
**Category:** General Usage\
**Tags:** question\
**Created:** [April 7, 2021, 5:00am UTC](https://discourse.julialang.org/t/keyerror-when-indexing-from-an-ordereddict-in-for-loop/58731 "2021-04-07T05:00:23Z")\
**Posts on this page:** 4\
**Page:** 1

<div class="post-metadata">

**Author:** ![GraceMabele](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/gracemabele/32/21360_2.png) [@GraceMabele](https://discourse.julialang.org/u/GraceMabele)\
**Post date:** [April 7, 2021, 5:00am UTC](https://discourse.julialang.org/t/keyerror-when-indexing-from-an-ordereddict-in-for-loop/58731/1 "2021-04-07T05:00:23Z")

</div>

How can I access or index an OrderedDict?  
I tried as below but returning keyerror

```julia
using DataStructures

price = OrderedDict(
"s1" => 0,
"s2" => 0,
"s3" => 0,
"s4" => 5
)

for s in 1:length(S)
    price[s]
end

```

Returns Error

KeyError: key 1 not found

Stacktrace:  
[1] getindex(::OrderedDict{String,Int64}, ::Int64) at C:\Users\glmab.julia\packages\OrderedCollections\cP9uu\src\ordered\_dict.jl:380  
[2] top-level scope at .\In[22]:2  
[3] include\_string(::Function, ::Module, ::String, ::String) at .\loading.jl:1091

---

<div class="post-metadata">

**Author:** ![nilshg](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/nilshg/32/2283_2.png) [@nilshg](https://discourse.julialang.org/u/nilshg)\
**Post date:** [April 7, 2021, 5:27am UTC](https://discourse.julialang.org/t/keyerror-when-indexing-from-an-ordereddict-in-for-loop/58731/2 "2021-04-07T05:27:49Z")

</div>

You still need to use they keys of the ordered dict, so iterate over `s in keys(price)`

---

<div class="post-metadata">

**Author:** ![GraceMabele](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/gracemabele/32/21360_2.png) [@GraceMabele](https://discourse.julialang.org/u/GraceMabele)\
**Post date:** [April 7, 2021, 5:33am UTC](https://discourse.julialang.org/t/keyerror-when-indexing-from-an-ordereddict-in-for-loop/58731/3 "2021-04-07T05:33:06Z")

</div>

The full equation is as follows

```julia
sum((price[s]*d[s,n]) for n in 1:length(N) for s in S )

```

And it returns the error

KeyError: key 1 not found

Stacktrace:  
[1] getindex at .\dict.jl:467 [inlined]  
[2] lookup\_index at C:\Users\glmab.julia\packages\JuMP\y5vgk\src\Containers\DenseAxisArray.jl:145 [inlined]  
[3] \_to\_index\_tuple at C:\Users\glmab.julia\packages\JuMP\y5vgk\src\Containers\DenseAxisArray.jl:154 [inlined] (repeats 2 times)  
[4] to\_index at C:\Users\glmab.julia\packages\JuMP\y5vgk\src\Containers\DenseAxisArray.jl:174 [inlined]  
[5] getindex(::JuMP.Containers.DenseAxisArray{VariableRef,2,Tuple{Array{String,1},Array{UnitRange{Int64},1}},Tuple{Dict{String,Int64},Dict{UnitRange{Int64},Int64}}}, ::String, ::Int64) at C:\Users\glmab.julia\packages\JuMP\y5vgk\src\Containers\DenseAxisArray.jl:192  
[6] (::var"#409#412"{Int64})(::String) at .\none:0  
[7] MappingRF at .\reduce.jl:93 [inlined]  
[8] \_foldl\_impl(::Base.MappingRF{var"#409#412"{Int64},Base.BottomRF{typeof(Base.add\_sum)}}, ::Base.\_InitialValue, ::Base.KeySet{String,OrderedDict{String,Int64}}) at .\reduce.jl:58  
[9] FlatteningRF at .\reduce.jl:119 [inlined]  
[10] MappingRF at .\reduce.jl:93 [inlined]  
[11] \_foldl\_impl(::Base.MappingRF{var"#410#411",Base.FlatteningRF{Base.BottomRF{typeof(Base.add\_sum)}}}, ::Base.\_InitialValue, ::UnitRange{Int64}) at .\reduce.jl:58  
[12] foldl\_impl at .\reduce.jl:48 [inlined]  
[13] mapfoldl\_impl at .\reduce.jl:44 [inlined]  
[14] #mapfoldl#204 at .\reduce.jl:160 [inlined]  
[15] mapfoldl at .\reduce.jl:160 [inlined]  
[16] #mapreduce#208 at .\reduce.jl:287 [inlined]  
[17] mapreduce at .\reduce.jl:287 [inlined]  
[18] sum at .\reduce.jl:494 [inlined]  
[19] sum(::Base.Iterators.Flatten{Base.Generator{UnitRange{Int64},var"#410#411"}}) at .\reduce.jl:511  
[20] top-level scope at In[25]:4  
[21] include\_string(::Function, ::Module, ::String, ::String) at .\loading.jl:1091

With S and N being

```julia
S = ["s1","s2","s3","s4"]
N = [1:10]

```

d is a variable

```julia
using JuMP

m = Model()

@variables m begin
  d[s in S, n in N] >= 0
end

```

---

<div class="post-metadata">

**Author:** ![nilshg](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/nilshg/32/2283_2.png) [@nilshg](https://discourse.julialang.org/u/nilshg)\
**Post date:** [April 7, 2021, 6:15am UTC](https://discourse.julialang.org/t/keyerror-when-indexing-from-an-ordereddict-in-for-loop/58731/4 "2021-04-07T06:15:53Z")

</div>

I don’t know how JuMP macros work, but the basic problem is the same - an `OrderedDict` still has to be indexed by its keys, not by integers (unless you are using integers as keys, but in that case you might as well just use an array?)

```julia
julia> for s in keys(price)
           @show s, price[s]
       end
(s, price[s]) = ("s1", 0)
(s, price[s]) = ("s2", 0)
(s, price[s]) = ("s3", 0)
(s, price[s]) = ("s4", 5)

```
