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

Question:

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?

Asked By: Cryssie

||

Answers:

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 matter, use the for loop.

Answered By: Peter DeGlopper

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
Answered By: TerryA

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

Answered By: Nikhil Gupta

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")
Answered By: olivecoder
Categories: questions Tags: , ,
Answers are sorted by their score. The answer accepted by the question owner as the best is marked with
at the top-right corner.