33

我有一本字典,我想根据一些键从中获取一些值。例如,我有一个用户字典,其中包含他们的名字、姓氏、用户名、地址、年龄等。比方说,我只想得到一个值(名称) - 姓氏或名字或用户名,但按降序排列,如下所示:

(1) last name:如果key存在,则获取value并停止检查。如果没有,请移至下一个键。

(2) first name:如果key存在,则获取value并停止检查。如果没有,请移至下一个键。

(3) 用户名​​:如果key存在,获取值或者返回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 块?

4

4 回答 4

46

如果键的数量很少,一种选择是使用链式获取:

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

但是,如果您定义了 keySet,这可能会更清楚:

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

链接get的 s 不会短路,因此将检查所有键,但只使用一个。如果您有足够多的可能重要的键,请使用for循环。

于 2013-06-25T22:38:07.237 回答
24

使用.get(),如果找不到密钥,则返回None

for i in keySet:
    temp = myDict.get(i)
    if temp is not None:
        print temp
        break
于 2013-06-25T22:39:20.110 回答
2

您也可以使用myDict.has_key(keyname)它来验证密钥是否存在。

根据评论编辑 -

这仅适用于低于 3.1 的版本。has_key已从 Python 3.1 中删除。in如果您使用的是 Python 3.1,则应使用运算符

于 2014-07-13T13:13:20.233 回答
2

如果我们将它封装在一个函数中,我们可以使用递归并通过正确命名函数来清楚地说明目的(不确定是否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")
于 2019-06-13T07:26:37.983 回答