简体   繁体   中英

Dict KeyError for value in the dict

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?

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.

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.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM