字典中的值的字典 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 假设一个键值存在于你传递的键中,并且它有一个 dictionary
和 Frequency
作为它的键之一。但是您首先遇到了 KeyError
异常,因为您没有匹配 18667209918
的密钥
因此正确初始化外层字典的键值对
我在一个字典中有一个字典:
{
'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 假设一个键值存在于你传递的键中,并且它有一个 dictionary
和 Frequency
作为它的键之一。但是您首先遇到了 KeyError
异常,因为您没有匹配 18667209918
因此正确初始化外层字典的键值对