【问题标题】:How to handle Python KeyError while implementing automata?实现自动机时如何处理 Python KeyError?
【发布时间】:2017-12-08 21:11:15
【问题描述】:

我正在使用 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 = {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 获得了解决方案。谢谢你。请随时发布其他一些不同的方式。

【问题讨论】:

  • 请注意,这种try-except 方式并不是非常糟糕。
  • 确实如此,但我想知道其他可能的方法来做同样的事情,因为我是 python 新手,
  • @Jyotirmay 你没有终端状态...?
  • 我不明白,什么是终端状态?

标签: python


【解决方案1】:

你可以使用dictget方法。

transition.get(state) # default for None

transition.get(state, False) # If key not in dict, False is returned

get() 方法返回给定键中的值。

如果key不在dict中,则返回默认值。

【讨论】:

  • 既然这不是那么简单,您能否解释一下为什么返回None 值是可以接受的?
  • 谢谢.. 在这里我修改了代码以获得我想要的。 { def RunAutomata(transition, initial, accepting, s): state = initial for c in s: state = transition[state].get(c) 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} , 'bfecedfed')}
  • @Rightleg ,你是什么意思?这样您就不会遇到异常,并且只要get 方法返回None,您就可以按照您想要的方式处理它。可以返回除None以外的其他值,这取决于业务流程。
  • 我认为我们不能放置像 default=None 这样的关键字参数。这样代码就会中断,否则,它工作正常。无论如何..谢谢。
  • @Jyotirmay transition.get(state, False)你可以试试这个。
猜你喜欢
  • 2021-12-24
  • 2020-12-23
  • 2016-09-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多