【问题标题】:Python Dictionary DataStructure which method d[] or d.get()?Python Dictionary DataStructure 哪个方法 d[] 或 d.get()?
【发布时间】:2011-10-03 07:02:16
【问题描述】:

在使用 Python 字典数据结构(包含键值对)时,如果我想从字典中检索一些值,我有两个选项 d[''] 和 g.get('key') 所以我现在很困惑哪个更好,为什么?我对这两种方式都有了解,但是当涉及到内存消耗和内存评估时,哪个更好??

希望得到一些肯定的答复,

问候。

【问题讨论】:

  • g.get('key') 如果 key 不存在不会抛出异常, g['key'] 会抛出异常。我不知道由于任何方法而导致的任何性能瓶颈。
  • @ anuj singh:我也担心交替使用它们的性能瓶颈,但我想回复说它不会影响。两者都是一样的。
  • 我希望您的问题得到解答:),如果您接受其中一个答案将非常有帮助。

标签: python data-structures


【解决方案1】:

来自Python Library Docs

d[key]
key 键返回 d 的项目。如果 key 不在地图中,则引发 KeyError

如果 dict 的子类定义了方法 __missing__(),如果键 key 不存在,d[key] 操作使用键 key 调用该方法争论。如果密钥不存在,d[key] 操作将返回或引发 __missing__(key) 调用返回或引发的任何内容。没有其他操作或方法调用__missing__()。如果未定义 __missing__(),则会引发 KeyError__missing__() 必须是方法;它不能是实例变量。 [...]

get(key[, default])
如果 key 在字典中,则返回 key 的值,否则返回 default。如果 default 没有给出,则默认为None,因此该方法永远不会引发KeyError

区别在于返回值。当您要求与不存在的键对应的值时,您要么想要

  1. KeyError 提出
  2. 调用的回调
  3. 返回默认值

Python 通过多种方法提供不同的功能。

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

  • get 致电dict_get
  • [] 致电dict_subscript

现在如果值存在,在dict_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);

dict_subscript 我们有

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 做了一个额外的解包元组!

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

【讨论】:

  • 所以 Ray 我可以说 d.get() 是为了避免意外崩溃并处理 dict 上 no Key 上的值???
  • @jigar get 的初衷是允许返回一个default,这使得计数应用程序之类的事情变得非常方便。从 Python 2.5 开始,[] 得到了增强,以避免在以某种方式配置子类时出现异常。
  • 使用 timeit.timeit(stmt='b = a["x"]',setup='a={"x":"hello world"}', number=10000 and 100000),然后将 stmt 修改为 .get("x","") - 使用 [] 与 .get 相比,时间差快 3-4 倍
  • 注意.get()是一个方法查找和调用,而[..]是用字节码实现的。正是出于这些原因,这使得“密钥存在”情况下的订阅速度更快。
  • 我们可以使用 collections.defaultdict 来获得与 d.get(key, default_value) 相同的功能吗?
【解决方案2】:

如果字典中不存在'key'

d['key']

会抛出一个KeyError,而

d.get('key')

将返回None

【讨论】:

    【解决方案3】:

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

    内存需求没有明显差异。

    【讨论】:

      【解决方案4】:

      它们是不同的,尤其是如果您的字典中没有键(请参阅here

      d[key]

      用key key返回d的item。如果键不在地图中,则引发 KeyError。

      get(key[, default])

      如果键在字典中,则返回键的值,否则 默认。如果未给出默认值,则默认为无,因此 方法永远不会引发 KeyError。

      【讨论】:

      • 所以霍华德,我可以说 get() 是处理不会影响正在运行的程序的异常,如果找不到密钥,我可以使用默认参数来处理,这两者都使用可互换根本不会影响内存???
      • @jigar 只需使用最适合您要求的方法。如果您想对丢失的密钥进行例外处理,请使用[],否则使用get。您不必关心运行时间或内存消耗。
      【解决方案5】:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2010-10-23
        • 1970-01-01
        • 2021-01-29
        • 2010-09-26
        • 2011-04-29
        • 2017-09-24
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多