如何在实现自动机时处理Python KeyError?
我正在使用Python实现一个简单的自动机函数如何在实现自动机时处理Python KeyError?,python,Python,我正在使用Python实现一个简单的自动机函数 def RunAutomata(transition, initial, accepting, s): state = initial for c in s: try: state = transition[state][c] except KeyError: return False return state in accepting dfa
def RunAutomata(transition, initial, accepting, s):
state = initial
for c in s:
try:
state = transition[state][c]
except KeyError:
return False
return state in accepting
dfa = {0:{'a':1, 'b':2},
1:{'c':3,'d':2},
2:{'f':3},
3:{'e':1}}
RunAutomata(dfa, 0, {2}, 'bfecedfedf')
这段代码的直觉:它检查dfa和字符串,以确定给定dfa下是否接受该字符串。如果接受返回True,否则返回False
在这里您可以看到,在字典中,我使用了字母键,所以在遍历时,如果找不到键,它会抛出KeyError。
我使用try-except块来处理它,但我想知道是否有更好的替代方法可以使用异常处理funda来解决这个问题
编辑:从@omri_sadon那里得到了一个解决方案。非常感谢。请随时发布一些其他不同的方式以及 您可以使用dict
get
方法
transition.get(state) # default for None
transition.get(state, False) # If key not in dict, False is returned
方法get()
返回给定键内的值
如果dict中没有键,则返回默认值。您可以使用dict
get
方法
transition.get(state) # default for None
transition.get(state, False) # If key not in dict, False is returned
方法get()
返回给定键内的值
如果dict中没有键,则返回默认值。由于这不是很简单,请您解释一下为什么返回
None
值是可以接受的。谢谢。。在这里,我修改了代码以得到我想要的。{def RunAutomata(transition,initial,accepting,s):state=initial for c in s:state=transition[state]。获取(c)接受dfa中的返回状态={0:{'a':1,'b':2},1:{'c':3,'d':2},2:{'f':3},3:{'e':1}运行自动机(dfa,0,{'2},'bfeceedfed')}@Rightleg,你是什么意思?这样,您就不会得到异常,只要get
方法返回None,您就可以按照您想要的方式处理它。您可以返回除None之外的其他值,这取决于业务流。我认为我们不能像default=None这样放置关键字参数。。这样,代码就被破坏了,否则,它就可以正常工作了。无论如何谢谢。@Jyotirmaytransition.get(state,False)
你可以试试这个。既然这不是那么简单,你能解释一下为什么返回None
值是可以接受的吗?谢谢。。在这里,我修改了代码以得到我想要的。{def RunAutomata(transition,initial,accepting,s):state=initial for c in s:state=transition[state]。获取(c)接受dfa中的返回状态={0:{'a':1,'b':2},1:{'c':3,'d':2},2:{'f':3},3:{'e':1}运行自动机(dfa,0,{'2},'bfeceedfed')}@Rightleg,你是什么意思?这样,您就不会得到异常,只要get
方法返回None,您就可以按照您想要的方式处理它。您可以返回除None之外的其他值,这取决于业务流。我认为我们不能像default=None这样放置关键字参数。。这样,代码就被破坏了,否则,它就可以正常工作了。无论如何谢谢。@Jyotirmaytransition.get(state,False)
你可以试试这个。请注意,这个try
-除了
的方法本质上并不坏。没错,但我想知道其他可能的方法,因为我是python新手,@Jyotirmay你可能没有终端状态…?我不明白,什么是终端状态?请注意,这种<代码>尝试<代码>-<代码>除了<代码>之外的方法本质上并不坏。确实如此,但我想知道其他可能的方法来做同样的事情,因为我是python新手,@jyotir你可能没有终端状态…?我不明白,终端状态是什么?