【问题标题】:KeyError python关键错误蟒蛇
【发布时间】:2014-07-31 04:16:14
【问题描述】:

我编写了一个程序,它可以转换字符串中的字母并返回一个字典。它有效,除非字母 'w' 在字符串中。有谁知道为什么会这样?这是我的代码:

def buildCoder(shift):
    import string
    impStr = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ'
    resultDict = {}

    lowerValues = dict()
    for index, letter in enumerate(string.ascii_lowercase):
        lowerValues[letter] = index + 1

    upperValues = dict()
    for index, letter in enumerate(string.ascii_uppercase):
        upperValues[letter] = index + 1

    inv_lowerValues = {v:k for k, v in lowerValues.items()}

    inv_upperValues = {v:k for k, v in upperValues.items()}

    for char in impStr:
        if char in string.ascii_lowercase:
            value = lowerValues[char]
            value += shift
            if value <= 25:
                resultDict[char] = inv_lowerValues[value]
            else:
                value = abs(26-value)
                resultDict[char] = inv_lowerValues[value]
        elif char in string.ascii_uppercase:
            value = upperValues[char]
            value += shift
            if value <= 25:
                resultDict[char] = inv_upperValues[value]
            else:
                value = abs(26-value)
                resultDict[char] = inv_upperValues[value]
    return resultDict

这是我得到的错误(如果'w' 包含在impStr 中):

KeyError                                  Traceback (most recent call last)
<ipython-input-117-0f4ac72e3c63> in <module>()
----> 1 buildCoder(3)

/var/folders/CV/CVkEwo3TGuu4+2cStWCRyE+++TQ/-Tmp-/tmpMr_sV1.py in buildCoder(shift)

KeyError: 0 

我也看到了这个错误:

Traceback (most recent call last):
  File "submission.py", line 24, in buildCoder
    resultDict[char] = inv_lowerValues[value]
KeyError: 0

*** ERROR: Expected to find a dictionary in the line:
Traceback (most recent call last):
  File "submission.py", line 24, in buildCoder
    resultDict[char] = inv_lowerValues[value]
KeyError: 0

 ***

【问题讨论】:

  • 它正在尝试查找0,而不是w。我的猜测是如果value == 26 会触发value = abs(26-value),这意味着它正在检查不存在的inv_lowerValues[0]
  • 看起来像 M.I.T 6.00X?

标签: python keyerror


【解决方案1】:

让我们对您的代码进行一些自省:

lowerValues['w'] == 23
inv_lowerValues[23] == 'w'

# presumably shift == 3

for char in impStr: # when char==w
    if char in string.ascii_lowercase: # it is
        value += shift # 23 + 3 == 26
        if values <= 25 # it's not
        else:
            value = abs(26-value)
            # abs( 26 - 26 ) == 0
            resultDict[char] = inv_lowerValues[value]
            # resultDict['w'] = inv_lowerValues[0]; KeyError

听起来您只是想确保您的班次围绕字母表进行。那不是abs(26-value),那是(value % 25)+1

【讨论】:

    【解决方案2】:

    我想,你想写

    value = abs(value-25)
    

    而不是

    value = abs(26-value)
    

    否则你会得到 0 作为值。

    【讨论】:

    • 绝对值始终为正...除非为零。
    • 我们不是在包装吗?为什么是abs(26-value) 而不是(value % 25)+1(还有一个更好的问题,我们为什么不使用0 作为密钥呢?
    • 更好的一点是,即使使用此修复程序,代码也不会返回应有的内容
    【解决方案3】:

    你正在做的更简洁的版本:

    import string
    
    def buildCoder(shift):
        alpha = string.ascii_lowercase
        ALPHA = string.ascii_uppercase
        if 0 <= shift < 26:
            unshifted_letters = ALPHA + alpha
            shifted_letters = ALPHA[shift:] + ALPHA[:shift] + alpha[shift:] + alpha[:shift]
            return dict(zip(unshifted_letters, shifted_letters))
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-08-24
      • 1970-01-01
      • 2016-10-17
      • 2017-02-24
      • 2019-01-08
      • 2017-08-05
      相关资源
      最近更新 更多