jinml
June 25, 2022, 7:37pm
1
I am trying to flatten the following Iterator:
julia> it=Iterators.product(1:3,1:4); collect(it)
3×4 Matrix{Tuple{Int64, Int64}}:
(1, 1) (1, 2) (1, 3) (1, 4)
(2, 1) (2, 2) (2, 3) (2, 4)
(3, 1) (3, 2) (3, 3) (3, 4)
and hope to get an length 12 iterator that yields a pair of indices a time. However, Iterators.flatten(it)
returns a length 24 iterator that yields one index a time:
julia> collect(Iterators.flatten(it))
24-element Vector{Int64}:
1
1
2
...
So how to generate the effect of two indices at a time? I’m looking for an iterator
that yields these pairs.
oheil
June 25, 2022, 7:54pm
3
If you don’t need the product, maybe this is what you can use:
julia> it = ( (i,j) for j in 1:4 for i in 1:3 )
Base.Iterators.Flatten{Base.Generator{UnitRange{Int64}, var"#22#23"}}(Base.Generator{UnitRange{Int64}, var"#22#23"}(var"#22#23"(), 1:4))
julia> collect(it)
12-element Vector{Tuple{Int64, Int64}}:
(1, 1)
(2, 1)
(3, 1)
(1, 2)
(2, 2)
(3, 2)
(1, 3)
(2, 3)
(3, 3)
(1, 4)
(2, 4)
(3, 4)
jinml
June 25, 2022, 7:59pm
4
Did not realize the extra for
instead of a ,
to have a flattening effect. Thank you!
Another way is to shield it
inside Ref()
or in a tuple:
collect(Iterators.flatten((it,)))
2 Likes