根据字典和键数组创建值数组

han*_*umi 4 julia

我是朱莉娅(Julia)的新手,所以对不起,这是一个基本问题。

假设我们有一个字典和一个键向量:

X = [2, 1, 1, 3]
d = Dict( 1 => "A", 2 => "B", 3 => "C")
Run Code Online (Sandbox Code Playgroud)

我想创建一个新数组,其中包含值而不是键(根据字典),因此最终结果将类似于

Y = ["B", "A", "A", "C"]
Run Code Online (Sandbox Code Playgroud)

我想我可以遍历向量元素,在字典中查找它并返回相应的值,但是对我来说这似乎效率很低。就像是

Y = Array{String}(undef, length(X))
for i in 1:length(X)
    Y[i] = d[X[i]]
end
Run Code Online (Sandbox Code Playgroud)

编辑:另外,如果X包含missing值,我建议的解决方案将不起作用。

所以我的问题是,是否有一些更有效的方法(我正在使用更大的数组和字典来完成),或者这是一种合适的方法?

Nil*_*dat 6

效率在不同的情况下可能意味着不同的事情,但我可能会这样做:

Y = [d[i] for i in X]
Run Code Online (Sandbox Code Playgroud)

如果X包含missing值,则可以skipmissing(X)在理解中使用。


Ste*_*ski 5

您可以使用数组推导简洁地执行此操作:

julia> [d[x] for x in X]
4-element Array{String,1}:
 "B"
 "A"
 "A"
 "C"
Run Code Online (Sandbox Code Playgroud)

将来可能会写得d.[X]更简洁一些,但是从Julia 1.3开始,这还不被允许。

根据对问题的编辑,让我们假设在missing某处有一个值X

julia> X = [2, 1, missing, 1, 3]
5-element Array{Union{Missing, Int64},1}:
 2
 1
  missing
 1
 3
Run Code Online (Sandbox Code Playgroud)

如果要映射missingmissing字符串或其他一些值(例如字符串)"?",则可以这样显式地进行操作:

julia> [ismissing(x) ? missing : d[x] for x in X]
5-element Array{Union{Missing, String},1}:
 "B"
 "A"
 missing
 "A"
 "C"

julia> [ismissing(x) ? "?" : d[x] for x in X]
5-element Array{String,1}:
 "B"
 "A"
 "?"
 "A"
 "C"
Run Code Online (Sandbox Code Playgroud)

如果您打算做很多事情,将这样missing的字典放入字典中可能会更容易:

julia> d = Dict(missing => "?", 1 => "A", 2 => "B", 3 => "C")
Dict{Union{Missing, Int64},String} with 4 entries:
  2       => "B"
  missing => "?"
  3       => "C"
  1       => "A"

julia> [d[x] for x in X]
5-element Array{String,1}:
 "B"
 "A"
 "?"
 "A"
 "C"
Run Code Online (Sandbox Code Playgroud)

如果您只想跳过缺少的值,可以使用skipmissing(X)代替X

julia> [d[x] for x in skipmissing(X)]
4-element Array{String,1}:
 "B"
 "A"
 "A"
 "C"
Run Code Online (Sandbox Code Playgroud)

通常,没有唯一正确的方法来处理缺失值,这就是为什么您需要显式编码如何处理缺失数据的原因。