# Counting the number of appearance of Tuples in a Vector

**URL:** https://discourse.julialang.org/t/counting-the-number-of-appearance-of-tuples-in-a-vector/108901
**Category:** New to Julia
**Tags:** question, tuple, dictionaries
**Created:** [January 17, 2024, 10:29am UTC](https://discourse.julialang.org/t/counting-the-number-of-appearance-of-tuples-in-a-vector/108901 "2024-01-17T10:29:35Z")
**Posts on this page:** 9
**Page:** 1

<div class="post-metadata">

### Author: ![blociss](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/blociss/32/16421_2.png) [@blociss](https://discourse.julialang.org/u/blociss)
#### Post date: [January 17, 2024, 10:29am UTC](https://discourse.julialang.org/t/counting-the-number-of-appearance-of-tuples-in-a-vector/108901/1 "2024-01-17T10:29:35Z")

</div>

Let vec = [(“A”, “B”), (“A”, “C”), (“A”, “D”), (“B”, “C”), (“B”, “D”)] be a vector.  
I want to count the number of appearance of each element at each step in the for loop.

```julia
function count_occurrences(vec)
    vect = []
    nb_appear_A = 0
    nb_appear_B = 0
    nb_appear_C = 0
    nb_appear_D = 0

    for v in vec
        v1, v2 = v 
        if v1 == "A"
            nb_appear_A += 1
        end
        if v2 == "A"
            nb_appear_A += 1
        end
        if v2 == "B"
            nb_appear_B += 1
        end
        if v1 == "B"
            nb_appear_B += 1
        end
        if v1 == "C"
            nb_appear_C += 1
        end
        if v2 == "C"
            nb_appear_C += 1
        end
        if v1 == "D"
            nb_appear_D += 1
        end
        if v2 == "D"
            nb_appear_D += 1
        end

        # I check for each pairs and push them onto vect
        if v1 == "A" && v2 == "B"
            push!(vect, (nb_appear_A, nb_appear_B))
        elseif v1 == "A" && v2 == "C"
            push!(vect, (nb_appear_A, nb_appear_C))
        elseif v1 == "A" && v2 == "D"
            push!(vect, (nb_appear_A, nb_appear_D))
        elseif v1 == "B" && v2 == "C"
            push!(vect, (nb_appear_B, nb_appear_C))
        elseif v1 == "B" && v2 == "D"
            push!(vect, (nb_appear_B, nb_appear_D))
        elseif v1 == "C" && v2 == "D"
            push!(vect, (nb_appear_C, nb_appear_D))
        end
    end

    return vect
end
 count_occurrences(vec)
5-element Vector{Any}:
 (1, 1)
 (2, 1)
 (3, 1)
 (2, 2)
 (3, 2)

```

This code works, but I would like to apply it for a different vector, say `vec = [("A", "B"), ("A", "C"), ("A", "D"), ("B", "C"), ("R", "E"),...]` .

---

<div class="post-metadata">

### Author: ![GunnarFarneback](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/gunnarfarneback/32/1827_2.png) [@GunnarFarneback](https://discourse.julialang.org/u/GunnarFarneback)
#### Post date: [January 17, 2024, 11:12am UTC](https://discourse.julialang.org/t/counting-the-number-of-appearance-of-tuples-in-a-vector/108901/2 "2024-01-17T11:12:50Z")

</div>

Just replace your multitude of variables with a dictionary:

```julia
function count_occurrences(vec)
    vect = []
    nb_appear = Dict()

    for v in vec
        v1, v2 = v
        nb_appear[v1] = get(nb_appear, v1, 0) + 1
        nb_appear[v2] = get(nb_appear, v2, 0) + 1
        push!(vect, (nb_appear[v1], nb_appear[v2]))
    end

    return vect
end

```

---

<div class="post-metadata">

### Author: ![rafael.guerra](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/rafael.guerra/32/216610_2.png) [@rafael.guerra](https://discourse.julialang.org/u/rafael.guerra)
#### Post date: [January 17, 2024, 2:58pm UTC](https://discourse.julialang.org/t/counting-the-number-of-appearance-of-tuples-in-a-vector/108901/3 "2024-01-17T14:58:32Z")

</div>

An alternative way without pushing, as the output vector length is known:

```julia
function count_occurrences2(v)
    vn = Vector{Tuple{Int, Int}}(undef, length(v))
    d = Dict(Iterators.flatten(v) .=> 0)
    for (i, vi) in pairs(v)
        d[vi[1]] += 1
        d[vi[2]] += 1
        vn[i] = (d[vi[1]], d[vi[2]])
    end
    return vn
end

```

---

<div class="post-metadata">

### Author: ![Dan](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/dan/32/42581_2.png) [@Dan](https://discourse.julialang.org/u/Dan)
#### Post date: [January 17, 2024, 4:46pm UTC](https://discourse.julialang.org/t/counting-the-number-of-appearance-of-tuples-in-a-vector/108901/4 "2024-01-17T16:46:25Z")

</div>

Another solution:

```julia
count_occurrences(v) = accumulate(v; 
  init=((0,0),Dict{String,Int}())) do (r,d),(x,y)
    (((d[x] = get(d,x,0)+1;), (d[y] = get(d,y,0)+1;)),d)
  end .|> first

```

From the same question on StackOverflow:

> <https://stackoverflow.com/questions/77831162/counting-the-number-of-appearance-of-tuples-in-a-vector>

---

<div class="post-metadata">

### Author: ![rafael.guerra](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/rafael.guerra/32/216610_2.png) [@rafael.guerra](https://discourse.julialang.org/u/rafael.guerra)
#### Post date: [January 17, 2024, 6:30pm UTC](https://discourse.julialang.org/t/counting-the-number-of-appearance-of-tuples-in-a-vector/108901/5 "2024-01-17T18:30:53Z")

</div>

I don’t know what OP would like as result when the input vector has tuples with equal elements such as `("A","A")`. For example for the input vector:

```julia
v = [("A","B"),("A","C"),("A","D"),("B","C"),("B","D"),("A","A")] 

```

The codes above may need to be adjusted slightly accordingly.

---

<div class="post-metadata">

### Author: ![stevengj](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/stevengj/32/71_2.png) [@stevengj](https://discourse.julialang.org/u/stevengj)
#### Post date: [January 17, 2024, 6:30pm UTC](https://discourse.julialang.org/t/counting-the-number-of-appearance-of-tuples-in-a-vector/108901/6 "2024-01-17T18:30:54Z")

</div>

> [@GunnarFarneback](#):
>
> Just replace your multitude of variables with a dictionary:

[`StatsBase.countmap`](https://juliastats.org/StatsBase.jl/stable/counts/#StatsBase.countmap) does this for you. (Apply it to `Iterators.flatten` to count individual elements in the tuples.)

---

<div class="post-metadata">

### Author: ![GunnarFarneback](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/gunnarfarneback/32/1827_2.png) [@GunnarFarneback](https://discourse.julialang.org/u/GunnarFarneback)
#### Post date: [January 17, 2024, 6:34pm UTC](https://discourse.julialang.org/t/counting-the-number-of-appearance-of-tuples-in-a-vector/108901/7 "2024-01-17T18:34:21Z")

</div>

That was my first thought too, but is not what the original code does.

---

<div class="post-metadata">

### Author: ![rocco\_sprmnt21](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/rocco_sprmnt21/32/20127_2.png) [@rocco\_sprmnt21](https://discourse.julialang.org/u/rocco_sprmnt21)
#### Post date: [January 17, 2024, 6:56pm UTC](https://discourse.julialang.org/t/counting-the-number-of-appearance-of-tuples-in-a-vector/108901/8 "2024-01-17T18:56:01Z")

</div>

for those who ignore or really can’t stand dictionaries

```julia
vc=collect(Base.Flatten(vec))
cumcount(s,c)=let fc=findlast(==(c),s;by=first); !isnothing(fc) ? (c,s[fc][2]+1) : (c,1) end
res=[]
foreach(c->push!(res,cumcount(res,c)), vc)
tuple.(res[1:2:end],res[2:2:end])

```

---

<div class="post-metadata">

### Author: ![rocco\_sprmnt21](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/rocco_sprmnt21/32/20127_2.png) [@rocco\_sprmnt21](https://discourse.julialang.org/u/rocco_sprmnt21)
#### Post date: [January 17, 2024, 7:13pm UTC](https://discourse.julialang.org/t/counting-the-number-of-appearance-of-tuples-in-a-vector/108901/9 "2024-01-17T19:13:48Z")

</div>

```julia

using StatsBase
vc=collect(Base.Flatten(vec))
res=[]
for (k,v) in countmap(vc)
    append!(res,k.=>1:v)
end

sort(res)[invperm(sortperm(vc))]

```
