Dict KeyError为dict中的值

时间:2015-12-09 14:08:28

标签: python dictionary keyerror

我在词典中有一个词典:

{
'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是当前正在搜索的号码)

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

4 个答案:

答案 0 :(得分:4)

您正在尝试搜索整数键:

phoneNumberDictionary[int(line)]

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

'123456789'

因此,整数 123456789的密钥不存在。

答案 1 :(得分:1)

使用整数作为键:

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

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

答案 2 :(得分:0)

不确定为什么你可能会在没有更多信息的情况下看到它 - 也许在解释器中运行并打印出(一个小的)示例输出?在任何情况下,我发现在这些情况下有帮助的事情是defaultdict这将使您选择的对象类型成为关键字。这个例子有点偏离基础,因为你没有同类的值类型(当然不是一个要求,但在使用defaultdict时最有意义):

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

那就是说,对于这样的结构,我认为一个物体更容易跟踪事物。

答案 3 :(得分:0)

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假定键值存在,并且您已经传递了密钥,并且dictionary的{​​{1}}作为其密钥之一。但是您首先遇到Frequency例外,因为您没有匹配KeyError

的密钥

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