Как узнать, содержится ли предмет в Dict in Julia - PullRequest
0 голосов
/ 02 февраля 2019

Я довольно новичок в Джулии и пытаюсь выяснить, как проверить, содержится ли данное выражение в Dict, который я создал.

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(:+ => +, :- => -, :* => *, :/ => /)

Я посмотрел документацию Джулии идругие ресурсы, но не могу найти никакого ответа на это.

"сова" - это название моего словаря, который я пытаюсь проверить.Я хочу выполнить инструкцию return, если expr [1] будет либо "+, -, * или /".

Ответы [ 2 ]

0 голосов
/ 02 февраля 2019

Стандартный подход для проверки, содержит ли какой-либо словарь какой-либо ключ:

:+ 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 name, так как parse - это функция, определенная в Base, поэтому мы не хотим иметь конфликт имен.Наконец, ваш myparse является рекурсивным, поэтому вы должны определить второй метод для этой функции, обрабатывающий случай, когда expr не является Array{Any}.

0 голосов
/ 02 февраля 2019

Я чувствую себя идиотом из-за того, что нашел это так быстро, но я нашел следующее решение: (Однако, желая услышать более эффективные ответы)

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

"да" должно быть установлено равным 0если выражение не найдено в словаре "сова".Так что простое утверждение! = If, чтобы увидеть, равен ли оно нулю, решает мою проблему.

...