计算向量中元组出现的次数

问题描述 投票:0回答:1

设 vec = [("A", "B"), ("A", "C"), ("A", "D"), ("B", "C"), ("B", "D")] 是一个向量。
我想统计for循环中每个步骤中每个元素出现的次数。

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)

此代码有效,但我想将其应用于不同的向量,例如

vec = [("A", "B"), ("A", "C"), ("A", "D"), ("B", "C"), ("R", "E"),...]

vector julia find-occurrences
1个回答
0
投票

尝试:

using StatsBase

function count_occurrences(v)
    d = countmap(Iterators.flatten(v))
    return [getindex.(Ref(d), p) for p in v]
end

例如,对于问题中的数据:

julia> v = [("A", "B"), ("A", "C"), ("A", "D"), ("B", "C"), ("B", "D")]
5-element Vector{Tuple{String, String}}:
 ("A", "B")
 ("A", "C")
 ("A", "D")
 ("B", "C")
 ("B", "D")

julia> count_occurrences(v)
5-element Vector{Tuple{Int64, Int64}}:
 (3, 3)
 (3, 2)
 (3, 2)
 (3, 2)
 (3, 2)
© www.soinside.com 2019 - 2024. All rights reserved.