【问题标题】:Python: How to check if keys exists and retrieve value from Dictionary in descending priorityPython:如何检查键是否存在并按降序从字典中检索值
【发布时间】:2013-06-22 22:05:52
【问题描述】:

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

(1) 姓氏:如果键存在,则获取值并停止检查。如果没有,请移至下一个键。

(2) 名字:如果键存在,获取值并停止检查。如果没有,请移至下一个键。

(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 块的情况下做到这一点?

【问题讨论】:

标签: python dictionary key-value


【解决方案1】:

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

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

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

【讨论】:

  • 在尝试检索之前是否先检查密钥是否存在?
  • 是的。这就是in 测试所做的。
  • 您介意解释一下 value = myDict.get(... part 的工作原理吗?
  • get 采用可选的第二个参数。如果键不在字典中,则将返回第二个参数,如果您没有指定,则返回 None。因此,如果lastName 不在字典中,它将评估第二个get,依此类推。
  • 谢谢!这正是我需要的。我不知道我能做到。
【解决方案2】:

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

for i in keySet:
    temp = myDict.get(i)
    if temp is not None:
        print temp
        break

【讨论】:

    【解决方案3】:

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

    根据 cmets 进行编辑 -

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

    【讨论】:

    • 只是为了更新读者,has_key 在 Python 3.x 中已被删除,请改用keyname in myDictdocs.python.org/3.1/whatsnew/3.0.html#builtins
    • 如果您使用的是 Python 2.2 或更高版本,则应使用 in 运算符,因为这是第一个版本 in 引入了映射类型,而 has_key 已被弃用。
    【解决方案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")
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-06-25
      • 2012-01-03
      • 2012-03-27
      • 2016-03-20
      • 2017-06-23
      • 2019-10-12
      • 2021-11-30
      相关资源
      最近更新 更多