Python: как проверить, существуют ли ключи и получить значение из словаря по убыванию приоритета
У меня есть словарь, и я хотел бы получить некоторые значения из него на основе некоторых ключей. Например, у меня есть словарь для пользователей с их именем, фамилией, именем пользователя, адресом, возрастом и т.д. Скажем, я хочу получить только одно значение (имя) - либо фамилию, либо имя, либо имя пользователя, но в нисходящем приоритете, как показано ниже:
(1) фамилия: если ключ существует, получить значение и остановить проверку. Если нет, перейдите к следующей клавише.
(2) имя: если ключ существует, получить значение и остановить проверку. Если нет, перейдите к следующей клавише.
(3) имя пользователя: если ключ существует, получить значение или вернуть 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']
Я попытался сделать все возможные значения и поместить их в список, чтобы я мог получить первый элемент в списке. Очевидно, это не сработало.
tempList = []
for key in keys:
get_value = myDict.get(key)
tempList .append(get_value)
Есть ли лучший способ сделать это без использования if else block?
Ответы
Ответ 1
Один из вариантов, если количество клавиш невелик, - это использовать цепочку:
value = myDict.get('lastName', myDict.get('firstName', myDict.get('userName')))
Но если у вас установлен ключ, это может быть яснее:
value = None
for key in keySet:
if key in myDict:
value = myDict[key]
break
Прикованный get
не замыкается, поэтому все ключи будут проверяться, но только один используется. Если у вас есть достаточно возможных ключей, которые имеют значение, используйте цикл for
.
Ответ 2
Используйте .get()
, который, если ключ не найден, возвращает None
.
for i in keySet:
temp = myDict.get(i)
if temp is not None:
print temp
break
Ответ 3
Вы можете использовать myDict.has_key(keyname)
, чтобы проверить, существует ли ключ.
Изменить на основе комментариев -
Это будет работать только на версиях ниже 3.1. has_key
был удален из Python 3.1. Вы должны использовать оператор in
, если вы используете Python 3.1
Ответ 4
Если мы инкапсулируем это в функцию, мы можем использовать рекурсию и четко указать цель, назвав функцию правильно (не уверен, что getAny
на самом деле является хорошим именем):
def getAny(dic, keys, default=None):
return (keys or default) and dic.get(keys[0],
getAny( dic, keys[1:], default=default))
или даже лучше, без рекурсии и понятнее
def getAny(dic, keys, default=None):
for k in keys:
if k in dic:
return dic[k]
return default
Тогда это можно использовать способом, аналогичным методу dict.get, например:
getAny(myDict, keySet)
и даже иметь результат по умолчанию в случае, если ключи вообще не найдены:
getAny(myDict, keySet, "not found")