字典中的值的字典 KeyError

Dict KeyError for value in the dict

我在一个字典中有一个字典:

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

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

您正在尝试搜索整数键:

phoneNumberDictionary[int(line)]

但是,您的字典是用 phone 数字作为字符串定义的。

'123456789'

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

使用整数作为键:

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

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

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

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

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

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

的密钥

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