Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/293.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/webpack/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python:如何检查键是否存在并以降序优先级从字典中检索值_Python_Dictionary_Key Value - Fatal编程技术网

Python:如何检查键是否存在并以降序优先级从字典中检索值

Python:如何检查键是否存在并以降序优先级从字典中检索值,python,dictionary,key-value,Python,Dictionary,Key Value,我有一个字典,我想根据一些键从中获取一些值。例如,我有一本用户字典,上面有他们的名字、姓氏、用户名、地址、年龄等等。比方说,我只想得到一个值(名称)——姓、名或用户名,但优先级递减,如下所示: (1) 姓氏:若键存在,则获取值并停止检查。如果没有,请移动到下一个关键点 (2) 名字:若键存在,获取值并停止检查。如果没有,请移动到下一个关键点 (3) 用户名:如果密钥存在,则获取值或返回null/empty #my dict looks something like this myDict = {

我有一个字典,我想根据一些键从中获取一些值。例如,我有一本用户字典,上面有他们的名字、姓氏、用户名、地址、年龄等等。比方说,我只想得到一个值(名称)——姓、名或用户名,但优先级递减,如下所示:

(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块来执行此操作?

如果键的数量很小,一个选项是使用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")