# Conditional iterator?

**URL:** https://discourse.julialang.org/t/conditional-iterator/40735
**Category:** New to Julia
**Created:** [June 4, 2020, 2:28pm UTC](https://discourse.julialang.org/t/conditional-iterator/40735 "2020-06-04T14:28:39Z")
**Posts on this page:** 6
**Page:** 1

<div class="post-metadata">

### Author: ![ohmsweetohm1](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/ohmsweetohm1/32/49126_2.png) [@ohmsweetohm1](https://discourse.julialang.org/u/ohmsweetohm1)
#### Post date: [June 4, 2020, 2:28pm UTC](https://discourse.julialang.org/t/conditional-iterator/40735/1 "2020-06-04T14:28:39Z")

</div>

Is it possible to write something like this:

```julia
for (key, val) in dict if val != b
    # do something 
end

```

This would do the job

```julia
for (key, val) in dict 
    if val == b continue end
    # do something 
end

```

and this too

```julia
for (key, val) in dict if val != b
    # do something 
end end

```

but this looks funny.  
After all you can write

```julia
[val for (key, val) in dict if val != b]

```

---

<div class="post-metadata">

### Author: ![anon94023334](https://avatars.discourse-cdn.com/v4/letter/a/e274bd/32.png) [@anon94023334](https://discourse.julialang.org/u/anon94023334)
#### Post date: [June 4, 2020, 3:28pm UTC](https://discourse.julialang.org/t/conditional-iterator/40735/2 "2020-06-04T15:28:48Z")

</div>

```julia
for (k, v) in dict
    v == b && continue
    # do something
end

```

---

<div class="post-metadata">

### Author: ![non-Jedi](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/non-jedi/32/3645_2.png) [@non-Jedi](https://discourse.julialang.org/u/non-Jedi)
#### Post date: [June 4, 2020, 3:53pm UTC](https://discourse.julialang.org/t/conditional-iterator/40735/3 "2020-06-04T15:53:02Z")

</div>

If you really wanted something similar to this syntax, you could create a macro that transforms:

```julia
@when v != b, for (k, v) in dict
    # do something
end

```

into:

```julia
for (k, v) in dict
    if v != b
        # do something
    end
end

```

But in general, I think you’re better off writing it as shown by sbrombger above.

---

<div class="post-metadata">

### Author: ![kristoffer.carlsson](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/kristoffer.carlsson/32/22_2.png) [@kristoffer.carlsson](https://discourse.julialang.org/u/kristoffer.carlsson)
#### Post date: [June 4, 2020, 4:02pm UTC](https://discourse.julialang.org/t/conditional-iterator/40735/4 "2020-06-04T16:02:10Z")

</div>

Maybe

```julia
julia> d = Dict(1=>2, 2=>3, 3=>4)
Dict{Int64,Int64} with 3 entries:
  2 => 3
  3 => 4
  1 => 2

julia> b = 3
3

julia> for (k,v) in Iterators.filter(kv -> kv.second != b, d)
           @show k, v
       end
(k, v) = (3, 4)
(k, v) = (1, 2)

```

---

<div class="post-metadata">

### Author: ![anon94023334](https://avatars.discourse-cdn.com/v4/letter/a/e274bd/32.png) [@anon94023334](https://discourse.julialang.org/u/anon94023334)
#### Post date: [June 4, 2020, 4:30pm UTC](https://discourse.julialang.org/t/conditional-iterator/40735/5 "2020-06-04T16:30:45Z")

</div>

`Iterator.filter` is twice as slow for large dictionaries:

```julia
julia> @benchmark it(d, 3)
BenchmarkTools.Trial: 
  memory estimate: 48 bytes
  allocs estimate: 2
  --------------
  minimum time: 1.532 s (0.00% GC)
  median time: 1.534 s (0.00% GC)
  mean time: 1.534 s (0.00% GC)
  maximum time: 1.538 s (0.00% GC)
  --------------
  samples: 4
  evals/sample: 1

julia> @benchmark noit(d, 3)
BenchmarkTools.Trial: 
  memory estimate: 16 bytes
  allocs estimate: 1
  --------------
  minimum time: 839.276 ms (0.00% GC)
  median time: 840.889 ms (0.00% GC)
  mean time: 841.129 ms (0.00% GC)
  maximum time: 843.754 ms (0.00% GC)
  --------------
  samples: 6
  evals/sample: 1

```

```julia
julia> function it(d, b)
           i = 0
           for (k, v) in Iterators.filter(kv -> kv.second != b, d)
               i += 1
           end
           i
       end

julia> function noit(d, b)
           i = 0
           for (k, v) in d
               v == b && continue
               i += 1
           end
           i
       end

```

---

<div class="post-metadata">

### Author: ![kristoffer.carlsson](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/kristoffer.carlsson/32/22_2.png) [@kristoffer.carlsson](https://discourse.julialang.org/u/kristoffer.carlsson)
#### Post date: [June 4, 2020, 5:26pm UTC](https://discourse.julialang.org/t/conditional-iterator/40735/6 "2020-06-04T17:26:12Z")

</div>

> [@anon94023334](#):
>
> `Iterator.filter` is twice as slow for large dictionaries:

The title said “conditional iterator” so I assumed that an iterator was desired.
