我在词典中有一个词典:
{
'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是当前正在搜索的号码)
然而,当我打印字典并只搜索该号码时,我可以立即找到它。 有什么想法吗?
答案 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
因此,正确初始化外部字典的键值对。