1

我有一个a_sym长度符号向量和一个长度N_sym字符串向量a_strN_str

a_sym在每个索引处包含符号,例如:H₅B₂O₆⁻

a_str在每个索引处包含字符串,例如H₅B₂O₆⁻

我想检查每个向量的等价性a_syma_str查看等价性出现在哪个索引中。

我试图实现一个循环来检查这两个向量:

E = zeros(Int64,N_sym)

for i in 1:N_str
    for ii in 1:N_sym
        if a_sym[ii] == a_str[i]
            E[ii] = i
        end
    end
end

我在哪里E尝试映射等效索引,但我的循环从未检测到字符串是等效的。如何补救?(也许简化了?)

例如:

a_sym = [:H₃BO₃ ,:H₄BO₄⁻ ,:Li⁺ ,:H₅B₂O₆⁻, :H₄B₃O₇⁻]

其中 N_sym 为 5,并且:

a_str = ["O⁻","H₃BO₃","H₄BO₄⁻","H₅B₂O₆⁻","H₄B₃O₇⁻","H₃B₃O₆"]

其中 N_str 为 6。当存在等价时,我需要循环检查两个向量并映射索引,例如,a_sym 中 H₃BO₃ 的索引为 1,a_str 中的索引为 2。

我期望一个向量E = [2, 3, 0, 4, 5]填充了 a_str 的索引,如果 a_str 不包含 a_sym 的匹配项,则为 0

4

1 回答 1

4

符号和字符串永远不等价:

julia> :a == "a"
false

因此,您必须先将其中一个转换为另一个。我将使用内置函数按如下方式编写您的函数findfirst

julia> E = [findfirst(==(String(b)), a_str) for b in a_sym]
5-element Array{Union{Nothing, Int64},1}:
 2
 3
  nothing
 4
 5

(尽管,正如 Przemislaw 所指出的,将字符串转换为符号可能会更有效。)

nothing是什么findfirst返回如果它没有找到任何东西。您可以通过广播将其转换为默认值something

julia> something.(E, 0)
5-element Array{Int64,1}:
 2
 3
 0
 4
 5
于 2021-07-07T12:35:57.693 回答