Julia 基于字典和键数组创建值数组

Julia 基于字典和键数组创建值数组,julia,Julia,我是朱莉娅的新手,如果这是一个基本问题,我很抱歉 假设我们有一本字典和一个键向量: X = [2, 1, 1, 3] d = Dict( 1 => "A", 2 => "B", 3 => "C") 我想创建一个新数组,它包含值而不是键(根据字典),因此最终结果如下 Y = ["B", "A", "A", "C"] Y = Array{String}(undef, length(X)) for i in 1:length(X) Y[i] = d[X[i]] end

我是朱莉娅的新手,如果这是一个基本问题,我很抱歉

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

X = [2, 1, 1, 3]
d = Dict( 1 => "A", 2 => "B", 3 => "C")
我想创建一个新数组,它包含值而不是键(根据字典),因此最终结果如下

Y = ["B", "A", "A", "C"]
Y = Array{String}(undef, length(X))
for i in 1:length(X)
    Y[i] = d[X[i]]
end
我想我可以迭代向量元素,在字典中查找并返回相应的值,但这对我来说效率太低了。 差不多

Y = ["B", "A", "A", "C"]
Y = Array{String}(undef, length(X))
for i in 1:length(X)
    Y[i] = d[X[i]]
end
编辑:另外,如果
X
包含
缺少的值,则我建议的解决方案不起作用


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

效率在不同的上下文中可能意味着不同的事情,但我可能会:

Y = [d[i] for i in X]

如果
X
包含
缺少的
值,您可以在理解中使用
skipmissing(X)

您可以使用数组理解非常简洁地执行此操作:

julia> [d[x] for x in X]
4-element Array{String,1}:
 "B"
 "A"
 "A"
 "C"
将来可能会编写
d[X]
来更简洁地表达这一点,但从Julia 1.3开始,这是不允许的

根据对问题的编辑,假设在
X
中的某个位置缺少
值:

julia> X = [2, 1, missing, 1, 3]
5-element Array{Union{Missing, Int64},1}:
 2
 1
  missing
 1
 3
julia> [d[x] for x in skipmissing(X)]
4-element Array{String,1}:
 "B"
 "A"
 "A"
 "C"
如果要将
missing
映射到
missing
或其他一些值,如字符串
“?”
,可以这样明确地执行:

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"
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"
如果您打算经常这样做,那么在字典中输入
missing
可能会更容易,如下所示:

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"
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"
如果只想跳过缺少的值,可以使用
skipmissing(X)
而不是
X

julia> X = [2, 1, missing, 1, 3]
5-element Array{Union{Missing, Int64},1}:
 2
 1
  missing
 1
 3
julia> [d[x] for x in skipmissing(X)]
4-element Array{String,1}:
 "B"
 "A"
 "A"
 "C"

通常没有一种正确的方法来处理缺少的值,这就是为什么您需要显式地编写代码来处理缺少的数据。

您自己的建议的可能重复是非常高效的,而且可能是最快的解决方案。Julia中的循环非常快,通常是最佳解决方案。请注意,您可以使用
Char
s来代替length-1字符串,例如
'A'
,这会更快。@DNF谢谢!我不知道Char的事。我想我唯一剩下的问题是与我的编辑相关的:当
X
缺失的
值时,这能适应工作吗?如果我实现了这一点,我会发现
KeyError:key missing not found
。我在下面编辑了我的答案。有几种很好的解决方案,有些简洁,有些冗长,但这里重要的一点是循环速度很快,您不一定需要寻找固定的“内置”解决方案。你自己的循环代码会很快。这需要一些时间来学习Matlabber、Pythonistas和R用户;)太棒了!是否可以对其进行调整,以处理
X
中缺少的
值?(我编辑了这个问题)。
skipmissing(X)
有效,但是
Y
X
的长度不同。然而,我发现在字典中为
missing
添加一个键值对可以让我使用您提出的解决方案,并将缺少的值保留在
Y
中:
d=Dict{Union{Integer,missing},Union{String,missing}(1=>“a”,2=>“B”,3=>“C”,missing=>missing)
据我所知,
[d[I]对于i,skipmissing(X)]
适用于一般情况,而不需要在dict中使用任何额外的keyval对。或者,您真的需要它们具有相同的长度吗?是的,您是对的。但是我需要保留缺少值的条目(是的,长度相同)。如果
X
包含
缺少的
,该怎么办?(见以上评论)