Python:如何检查键是否存在并以降序优先级从字典中检索值
我有一个字典,我想根据一些键从中获取一些值。例如,我有一本用户字典,上面有他们的名字、姓氏、用户名、地址、年龄等等。比方说,我只想得到一个值(名称)——姓、名或用户名,但优先级递减,如下所示: (1) 姓氏:若键存在,则获取值并停止检查。如果没有,请移动到下一个关键点 (2) 名字:若键存在,获取值并停止检查。如果没有,请移动到下一个关键点 (3) 用户名:如果密钥存在,则获取值或返回null/emptyPython:如何检查键是否存在并以降序优先级从字典中检索值,python,dictionary,key-value,Python,Dictionary,Key Value,我有一个字典,我想根据一些键从中获取一些值。例如,我有一本用户字典,上面有他们的名字、姓氏、用户名、地址、年龄等等。比方说,我只想得到一个值(名称)——姓、名或用户名,但优先级递减,如下所示: (1) 姓氏:若键存在,则获取值并停止检查。如果没有,请移动到下一个关键点 (2) 名字:若键存在,获取值并停止检查。如果没有,请移动到下一个关键点 (3) 用户名:如果密钥存在,则获取值或返回null/empty #my dict looks something like this myDict = {
#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块来执行此操作?如果键的数量很小,一个选项是使用chained-get:
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
s不会短路,因此将检查所有钥匙,但只使用一把。如果您有足够重要的可能键,请使用for
循环。使用.get()
,如果找不到键,则返回None
for i in keySet:
temp = myDict.get(i)
if temp is not None:
print temp
break
您还可以使用
myDict.has_key(keyname)
来验证密钥是否存在
根据评论进行编辑-
这只适用于低于3.1的版本<代码>has_键已从Python 3.1中删除。如果您使用的是Python 3.1,那么您应该使用
in
操作符,如果我们将其封装在一个函数中,那么我们可以使用递归,并通过正确命名函数来清楚地说明其用途(不确定getAny
是否真的是一个好名字):
或者更好,没有递归,更清晰:
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")
在尝试检索密钥之前,是否先检查密钥是否存在?是。这就是测试中的
。您介意解释一下value=myDict.get是如何得到的吗(…部分工作?get
接受可选的第二个参数。如果该键不在字典中,则将返回第二个参数,如果未指定,则返回第二个参数。None
。因此,如果dict中没有lastName
,它将计算第二个get
,依此类推。谢谢!这正是我需要的。我不知道我可以这样做。为了更新阅读器,Python3.x中已删除了has_key
,请改为在myDict中使用keyname
。如果您使用的是Python2.2或更高版本,则应使用in
操作符,因为这是针对映射类型引入的第一个版本in
,并且has_key
已被弃用。另请参阅:
getAny(myDict, keySet, "not found")