【问题标题】:Dict KeyError for value in the dict字典中的值的字典 KeyError
【发布时间】:2015-12-09 14:08:28
【问题描述】:

我在字典中有一个字典:

{
'123456789': {u'PhoneOwner': u'Bob', 'Frequency': 0},
'98765431': {u'PhoneOwner': u'Sarah', 'Frequency': 0},
}

这个想法是扫描由数字发出的调用列表并与字典进行比较,每次找到匹配项时增加频率。

当我运行脚本时:

try:
phoneNumberDictionary[int(line)]['Frequency'] += 1
except KeyError:
phoneNumberDictionary[int(line)]['Frequency'] = 1

我得到错误:

KeyError: '18667209918'

(其中 18667209918 是当前正在搜索的号码)

然而,当我打印 dict 并搜索该号码时,我可以立即找到它。 有什么想法吗?

【问题讨论】:

    标签: python dictionary keyerror


    【解决方案1】:

    您正在尝试搜索整数键:

    phoneNumberDictionary[int(line)]
    

    但是,您的字典是使用您的电话号码作为字符串定义的。

    '123456789'
    

    因此,具有整数 123456789 的键不存在。

    【讨论】:

      【解决方案2】:

      使用整数作为键:

      {
      123456789: {u'PhoneOwner': u'Bob', 'Frequency': 0},
      98765431: {u'PhoneOwner': u'Sarah', 'Frequency': 0},
      }
      

      你有字符串作为键,但你需要整数。

      【讨论】:

        【解决方案3】:
        dictionary =  {
             '123456789': {u'PhoneOwner': u'Bob', 'Frequency': 0},
             '98765431': {u'PhoneOwner': u'Sarah', 'Frequency': 0},
             }
        key_present = '123456789'
        
        try:
            dictionary[key_present]['Frequency'] += 1
        except KeyError:
            pass
        
        key_not_present = '12345'
        
        try:
            dictionary[key_not_present]['Frequency'] += 1
        except KeyError:
            dictionary[key_not_present] = {'Frequency': 1}
        
        print dictionary
        

        您将字符串作为字典中的键,但要访问您使用的是整数键。

        我想你仍然会从异常块中的语句中得到KeyError。从您的声明phoneNumberDictionary[int(line)]['Frequency'] = 1 python 假设存在一个键值与您所传递的键,并且它有一个dictionaryFrequency 作为它的键之一。但是您首先遇到了KeyError 异常,因为您没有与18667209918 匹配的密钥

        因此正确初始化外层字典的键值对。

        【讨论】:

        • 所以我更正了将键作为字符串而不是整数的问题,从而解决了一个问题。当字典中没有数字时,第二部分没有通过,所以:除了 KeyError: pass 立即解决了。
        【解决方案4】:

        不知道为什么您可能会在没有更多信息的情况下看到这一点 - 也许在解释器中运行并打印出(一个小)示例输出?无论如何,我发现在这些情况下有帮助的东西是defaultdict,它将成为您选择的对象类型的键。这个例子有点离题,因为你没有同质的值类型(当然不是必需的,但在使用 defaultdict 时最有意义):

        from collections import defaultdict
        phoneNumberDict = defaultdict(lambda: defaultdict(int))
        phoneNumber[int(vline)]["Frequency"] += 1
        

        也就是说,对于这样的结构,我认为对象会更容易跟踪事物。

        【讨论】:

          猜你喜欢
          • 2016-12-20
          • 2021-02-03
          • 1970-01-01
          • 2022-07-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2013-04-29
          相关资源
          最近更新 更多