Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/283.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字典数据结构哪个方法d[]或d.get()?_Python_Data Structures - Fatal编程技术网

Python字典数据结构哪个方法d[]或d.get()?

Python字典数据结构哪个方法d[]或d.get()?,python,data-structures,Python,Data Structures,在使用Python字典数据结构(包含键值对)时,如果我想从字典中检索一些值,我有两个选项d[“”]和g.get('key'),所以我现在不知道哪个更好,为什么??我在某种程度上理解这两种方法,但在内存消耗和内存评估方面,哪一种更好 希望得到一些积极的答复 问候。来自 d[键] 返回带有key的d项。如果键不在映射中,则引发一个KeyError 如果dict的子类定义了一个方法\uuuu missing\uuuuu(),如果key不存在,则d[key]操作将以key作为参数调用该方法。如果键不存在

在使用Python字典数据结构(包含键值对)时,如果我想从字典中检索一些值,我有两个选项d[“”]和g.get('key'),所以我现在不知道哪个更好,为什么??我在某种程度上理解这两种方法,但在内存消耗和内存评估方面,哪一种更好

希望得到一些积极的答复

问候。

来自

d[键]

返回带有key的d项。如果键不在映射中,则引发一个
KeyError

如果dict的子类定义了一个方法
\uuuu missing\uuuuu()
,如果key不存在,则
d[key]
操作将以key作为参数调用该方法。如果键不存在,则
d[key]
操作将返回或引发
\uuuuu missing\uuuu(key)
调用返回或引发的任何内容。没有其他操作或方法调用
\uuuu missing\uuuu()
。如果未定义
\uuuu missing\uuuu()
,则会引发
KeyError
\uuu missing\uuu()
必须是一个方法;它不能是实例变量。[……]

get(键[,默认值])

如果键在字典中,则返回键的值,否则为默认值。如果未指定默认值,则默认为
None
,因此此方法不会引发
keyrorm

区别在于返回值。当您请求与不存在的键对应的值时,您可以

  • 出现
    键错误
  • 调用了一个回调函数
  • 返回的默认值
  • Python通过多种方法提供不同的功能

    在调用
    \u missing\u
    或引发异常时,如果找不到键,则使用
    []
    会影响性能。至于有钥匙时哪个更快,我检查了源代码。(我使用了2.7.2进行检查。)在
    dictobject.c
    中,我们看到:

    • get
      调用
      dict\u get
    • []
      调用
      命令下标
    现在,如果值存在,则在
    dict\u get

    if (!PyArg_UnpackTuple(args, "get", 1, 2, &key, &failobj))
        return NULL;
    
    if (!PyString_CheckExact(key) ||
        (hash = ((PyStringObject *) key)->ob_shash) == -1) {
        hash = PyObject_Hash(key);
        if (hash == -1)
            return NULL;
    }
    ep = (mp->ma_lookup)(mp, key, hash);
    
    assert(mp->ma_table != NULL);
    if (!PyString_CheckExact(key) ||
        (hash = ((PyStringObject *) key)->ob_shash) == -1) {
        hash = PyObject_Hash(key);
        if (hash == -1)
            return NULL;
    ep = (mp->ma_lookup)(mp, key, hash);
    
    dict_subscript
    中,我们有

    if (!PyArg_UnpackTuple(args, "get", 1, 2, &key, &failobj))
        return NULL;
    
    if (!PyString_CheckExact(key) ||
        (hash = ((PyStringObject *) key)->ob_shash) == -1) {
        hash = PyObject_Hash(key);
        if (hash == -1)
            return NULL;
    }
    ep = (mp->ma_lookup)(mp, key, hash);
    
    assert(mp->ma_table != NULL);
    if (!PyString_CheckExact(key) ||
        (hash = ((PyStringObject *) key)->ob_shash) == -1) {
        hash = PyObject_Hash(key);
        if (hash == -1)
            return NULL;
    ep = (mp->ma_lookup)(mp, key, hash);
    
    唯一的区别是,
    get
    会额外解包元组


    重要的?我不知道。:-)

    不同之处在于,如果密钥丢失,
    d[key]
    将引发
    keyrerror
    异常,而
    d.get(key)
    将返回
    None
    (而
    d.get(key,default)
    将返回默认值)


    内存需求没有明显的差异。

    它们是不同的,尤其是当您的字典中没有键时(请参阅)

    d[键]

    返回带有key的d项。如果键不在映射中,则引发KeyError

    get(键[,默认值])

    如果键在字典中,则返回键的值,否则 违约如果未给出default,则默认为None,因此 方法从不引发键错误


    如果字典中不存在“键”

    d['key']

    将抛出一个
    键错误
    ,而

    d.get('key')


    将返回
    None

    如果键存在,它们的行为相同。但是如果找不到密钥,
    d['key']
    将引发一个
    KeyError
    异常,而
    d.get('key')
    将返回
    None
    。您还可以为get方法提供第二个参数,该参数将在未找到条件下返回:
    d.get('key','')
    如果找不到键,将返回空字符串。

    g.get('key')不会引发异常如果键不存在,g['key']将引发异常。我不知道任何一种方法都会导致性能瓶颈。@anuj singh:我也担心交替使用这些方法会导致性能瓶颈,但我想回答说它不会影响性能。两者都是一样的。我希望你的问题得到了回答:),如果你接受其中一个答案,这将非常有帮助。因此,我可以说d.get()是为了避免意外崩溃,并处理dict上找不到键的值???@jigar
    get
    的初衷是允许返回默认值,这使得计数应用程序非常方便。从Python2.5开始,增强了
    []
    以避免以某种方式配置子类时出现异常。使用timeit.timeit(stmt='b=a[“x”]',setup='a={“x”:“hello world”},number=10000和100000),然后将stmt修改为a.get(“x”,“”)——使用[]请注意,
    .get()
    是一个方法查找和调用,而
    […]
    是用字节码实现的。正是由于这些原因,这使得“key is present”情况下的订阅速度更快。我们可以使用collections.defaultdict获得与d.get(key,default_value)相同的功能吗是处理不会影响运行程序的异常,如果找不到键,我可以使用默认参数来处理,这两者交替使用不会影响内存???@jigar只需使用最适合您的要求的方法。如果您想对丢失的钥匙进行例外处理,请使用
    []
    否则
    获取
    。您不必关心运行时间或内存消耗。