Python: How to check if keys exists and retrieve value from Dictionary in descending priority
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 get
s 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")
Cryssie
Updated on June 17, 2020Comments
-
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?