Python: How to check if keys exists and retrieve value from Dictionary in descending priority

116,185

Solution 1

One option if the number of keys is small is to use chained gets:

value = myDict.get('lastName', myDict.get('firstName', myDict.get('userName')))

But if you have keySet defined, this might be clearer:

value = None
for key in keySet:
    if key in myDict:
        value = myDict[key]
        break

The chained gets do not short-circuit, so all keys will be checked but only one used. If you have enough possible keys that that matters, use the for loop.

Solution 2

Use .get(), which if the key is not found, returns None.

for i in keySet:
    temp = myDict.get(i)
    if temp is not None:
        print temp
        break

Solution 3

You can use myDict.has_key(keyname) as well to validate if the key exists.

Edit based on the comments -

This would work only on versions lower than 3.1. has_key has been removed from Python 3.1. You should use the in operator if you are using Python 3.1

Solution 4

If we encapsulate that in a function we could use recursion and state clearly the purpose by naming the function properly (not sure if getAny is actually a good name):

def getAny(dic, keys, default=None):
    return (keys or default) and dic.get(keys[0], 
                                         getAny( dic, keys[1:], default=default))

or even better, without recursion and more clear:

def getAny(dic, keys, default=None):
    for k in keys: 
        if k in dic:
           return dic[k]
    return default

Then that could be used in a way similar to the dict.get method, like:

getAny(myDict, keySet)

and even have a default result in case of no keys found at all:

getAny(myDict, keySet, "not found")
Share:
116,185
Cryssie
Author by

Cryssie

Updated on June 17, 2020

Comments

  • Cryssie
    Cryssie almost 4 years

    I have a dictionary and I would like to get some values from it based on some keys. For example, I have a dictionary for users with their first name, last name, username, address, age and so on. Let's say, I only want to get one value (name) - either last name or first name or username but in descending priority like shown below:

    (1) last name: if key exists, get value and stop checking. If not, move to next key.

    (2) first name: if key exists, get value and stop checking. If not, move to next key.

    (3) username: if key exists, get value or return null/empty

    #my dict looks something like this
    myDict = {'age': ['value'], 'address': ['value1, value2'],
              'firstName': ['value'], 'lastName': ['']}
    
    #List of keys I want to check in descending priority: lastName > firstName > userName
    keySet = ['lastName', 'firstName', 'userName']
    

    What I tried doing is to get all the possible values and put them into a list so I can retrieve the first element in the list. Obviously it didn't work out.

    tempList = []
    
    for key in keys:
        get_value = myDict.get(key)
        tempList .append(get_value)
    

    Is there a better way to do this without using if else block?