如何在Julia中查找字典中是否包含某个项

3

我对Julia还比较陌生,正在尝试弄清楚如何检查我创建的字典中是否包含给定的表达式。

最初的回答:

function parse( expr::Array{Any} )
   if expr[1] == #check here if "expr[1]" is in "owl"
       return BinopNode(owl[expr[1]], parse( expr[2] ), parse( expr[3] ) )
   end
end

owl = Dict(:+ => +, :- => -, :* => *, :/ => /)

我看了Julia的文档和其他资源,但找不到答案。
"owl"是我想要检查的字典名称。如果expr[1]是"+、-、*或/",我想运行返回语句。
最初的回答:无法找到有关如何在Julia中检查字典的特定键是否存在的信息。
2个回答

7

检查字典中是否包含某个键的标准方法是:

:+ in keys(owl)

或者

haskey(owl, :+)

您的解决方案取决于您确定字典中不存在值为0,但这在一般情况下可能不是真实的。然而,如果您想使用这种方法(当您不想两次在字典中查找时很有用:一次用于检查它是否包含某个键,第二次用于获取分配给该键的值(如果存在)),那么通常您会使用nothing作为哨兵,然后执行检查get_return_value !== nothing(注意这里有两个= - 它们对于编译器生成高效的代码非常重要)。所以您的代码应该像这样:

function myparse(expr::Array{Any}, owl) # better pass `owl` as a parameter to the function
   v = get(expr[1], owl, nothing)
   if v !== nothing
       return BinopNode(v, myparse(expr[2]), myparse(expr[3]))
   end
   # and what do we do if v === nothing?
end

请注意,我使用myparse名称,因为parse是在Base中定义的函数,所以我们不希望有名称冲突。最后,你的myparse是递归的,所以你应该定义第二个方法来处理当expr不是Array{Any}的情况。

-1

我觉得自己太蠢了,居然这么快就找到了解决办法:(不过还是愿意听听更高效的答案)

yes = 1
yes = get(owl,expr[1],0)
if yes != 0
   #do return statement here

如果在字典“owl”中找不到该表达式,那么"yes"应该被设为0。因此,一个简单的!=条件语句用于判断是否为零可以解决我的问题。

这在你的情况下可能会“意外地”起作用,但一般来说它有一个缺点,即如果owl包含了expr[1]的值为0,它将表现得好像没有包含该键一样。 - phipsgabler

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接