I have a dict inside a dict:
{
'123456789': {u'PhoneOwner': u'Bob', 'Frequency': 0},
'98765431': {u'PhoneOwner': u'Sarah', 'Frequency': 0},
}
The idea is to scan a list of calls made by numbers and compare against the dict, increasing the frequency each time a match is found.
When I run the script:
try:
phoneNumberDictionary[int(line)]['Frequency'] += 1
except KeyError:
phoneNumberDictionary[int(line)]['Frequency'] = 1
I get error:
KeyError: '18667209918'
(Where 18667209918 is the number that is currently being searched)
Yet when I print the dict and just search for that number I can find it immediately. Any ideas?
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
you have strings as keys in the dictionary but to access you are using an integer key.
I think you will still get KeyError
from the statement in the exception block. from your statement phoneNumberDictionary[int(line)]['Frequency'] = 1
python assumes that a key-value exists with the key you have passes and it has a dictionary
with Frequency
as one of its key. But you have got KeyError
exception in the first place because you did not have a key matching 18667209918
Therefore initialize the key-value pair of the outer dictionary properly.
You are attempting to search for a key that is an integer:
phoneNumberDictionary[int(line)]
However, your dictionary is defined with your phone numbers as strings.
'123456789'
Thus, the key with integer 123456789
doesn't exist.
Use integers as keys:
{
123456789: {u'PhoneOwner': u'Bob', 'Frequency': 0},
98765431: {u'PhoneOwner': u'Sarah', 'Frequency': 0},
}
You have strings as keys but you need integers.
Not sure why you might be seeing that without more information - perhaps run in the interpreter and print out (a small) example output? In any event, something that I've found that helps in those cases is defaultdict
Which will make a key with an object type of your choosing. It's a little off-base for this example, since you don't have homogeneous value-types (certainly not a requirement, but makes the most sense when using a defaultdict
):
from collections import defaultdict
phoneNumberDict = defaultdict(lambda: defaultdict(int))
phoneNumber[int(vline)]["Frequency"] += 1
That said, for such a structure, I would think an object would be easier to keep track of things.
来源:https://stackoverflow.com/questions/34180843/dict-keyerror-for-value-in-the-dict