Python字典数据结构哪个方法d[]或d.get()?
在使用Python字典数据结构(包含键值对)时,如果我想从字典中检索一些值,我有两个选项d[“”]和g.get('key'),所以我现在不知道哪个更好,为什么??我在某种程度上理解这两种方法,但在内存消耗和内存评估方面,哪一种更好 希望得到一些积极的答复 问候。来自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作为参数调用该方法。如果键不存在
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
区别在于返回值。当您请求与不存在的键对应的值时,您可以
键错误
\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上找不到键的值???@jigarget
的初衷是允许返回默认值,这使得计数应用程序非常方便。从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只需使用最适合您的要求的方法。如果您想对丢失的钥匙进行例外处理,请使用[]
否则获取
。您不必关心运行时间或内存消耗。