【问题标题】:Best practice in Python for accessing the value of a k/v pair which may not exist? [duplicate]Python 中访问可能不存在的 k/v 对的值的最佳实践? [复制]
【发布时间】:2016-04-06 10:52:16
【问题描述】:
function getParams(data) {
    return {
        id: data && data.uuid
    }
}

所以上面代表了 Javascript 中访问对象项的常见模式。

在 Python 中访问 dict 项目最常用的等效做法是什么?

会是这样吗?

def getParams(data):
    params = {}
    if data is not None and hasattr(data, "id"):
        params["id"] = data["id"]
    return params

如果不是,最佳做法是什么?谢谢。

【问题讨论】:

  • 您要访问属性 (data.foo)还是项目 (data['foo'])? JavaScript 对这些使用相同的语法,但它们在 Python 中是不同的。
  • 我想访问项目,抱歉。假设data 是一个python 字典。
  • 您真的要返回一个与您在原版中搜索的键相同的字典吗?

标签: javascript python


【解决方案1】:

如果你指的是属性:

params['id'] = data.id if data else None

如果你指的是物品:

params['id'] = data.get('id')

在这两种情况下,params['id'] 都将包含值或None

【讨论】:

  • 如果数据中不存在“id”怎么办?你检查了吗?
  • 如果数据中不存在'id',data.get('id') 将返回None。
【解决方案2】:

如果你想在不知道它是否存在的情况下从字典中获取密钥,你可以使用字典的get 方法。如果键不存在,则返回 None(或特定的默认值):

>>> x = {}
>>> print(x.get('a'))
None
>>> print(x.get('a', 'default'))
default

【讨论】:

  • 明白了。如果我想检查嵌套字典中的项目,传统的做法是什么?即 Javascript 等效项是:
  • data && data.uuid && data.uuid.someAttribute
  • @RyanYu:你可以多次使用get,比如data.get('uuid', {}).get('someAttribute', None)。但也可以在这个网站上四处寻找其他提出类似问题的人,有很多。
  • 虽然get 很方便,但请注意,它可能比使用in 的更冗长的代码要慢得多。
【解决方案3】:

Python dictjavascript 不同。

def getParams(data):
    params = {}
    if data and 'id' in data.keys():
        params["id"] = data["id"]
    return params

【讨论】:

  • 如果您想检查某个项目是否在字典中,请使用'id' in data。密钥检查是 dicts 的一个关键特性。
  • 丹尼尔所说的。 'id' in data.keys() 很浪费,因为它必须构造键对象。这在 Python 3 中并没有那么糟糕,因为它是一个 dictionary view object 访问底层的 dict;并且在 dictviews 上的查找速度很快。但是在 Python 2 中,dict.keys() 必须构建一个新的列表对象,并且列表上的查找涉及缓慢的线性搜索,而不是字典或集合提供的快速 O(1) 查找。
【解决方案4】:

您可以使用dictget 方法。也可以指定一个默认值,如果指定的key不存在就可以使用。

data.get('id', None)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-03-24
    • 2019-08-02
    • 1970-01-01
    • 2012-12-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-10-07
    相关资源
    最近更新 更多