Julia 中缺失值的字符串向量中模式的索引

Index of a pattern in a String vector with missing values in Julia

我正在尝试检索具有缺失值的字符串向量中某个模式的所有实例的索引。

例如我怎样才能得到一个向量,它包含所有包含模式"a"的实例的索引来自:

x = ["ab", "ca", "bc", missing, "ad"]

期望的结果将等于:

Vector([1, 2, 5])
3-element Vector{Int64}:
 1
 2
 5

因为这些是模式出现的索引。

一个自然的写法是:

julia> findall(v -> ismissing(v) ? false : contains(v, "a"), x)
3-element Vector{Int64}:
 1
 2
 5

或者你可以这样写:

julia> using Missings

julia> findall(coalesce.(passmissing(contains).(x, "a"), false))
3-element Vector{Int64}:
 1
 2
 5

在这种情况下可读性较差,但在其他情况下您可能会发现 passmissingcoalesce 很有用,所以我提到它们。

findall 版本可以更整洁:

julia> findall(contains("a"), skipmissing(x))
3-element Vector{Int64}:
 1
 2
 5

第一个很酷的事情是 contains returns 本身的柯里化版本,当只提供要搜索的模式时。所以在这里,contains("a") returns 一个在任何给定字符串参数中搜索 "a" 的函数,我们将该函数作为谓词传递给 findall

更酷的是 skipmissing 的工作方式。顾名思义,它会跳过其参数中的 missing 值,但它不仅会从 x 中过滤掉它们(这会更改 missing 之后所有值的索引) ,但通过提供一个迭代器来跳过 missing 值。这意味着通过迭代 skipmissing(x) 的索引 findall returns 也将对 x 有效,这正是我们想要的。