Подтвердить что ты не робот

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?

4b9b3361

Ответ 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")