【问题标题】:How to check for a key in a defaultdict without updating the dictionary (Python)?如何在不更新字典(Python)的情况下检查 defaultdict 中的键?
【发布时间】:2012-01-28 17:36:30
【问题描述】:

在使用 Python 字典时,我通常使用以下习惯用法:

try:
    val = dct[key]
except KeyError:
    print key, " is not valid"

因为对于大型词典,声明

if key in dct:
    # do something

效率不高(所以我记得读过,但我在实践中也注意到了)

今天我正在使用一个 defaultdict,但有一刻我忘记了 defaultdict 永远不会给你一个 KeyError,而是会更新原始字典。

如何在不更新默认字典的情况下执行查找?我真的需要打印一个错误,以便用户可以重新输入密钥。

谢谢!

更新: 几位发帖人认为我认为if key in dct: 很慢是错误的。我回去检查了我读过的书,最好使用try: except:。这是 2002 年的 Python 食谱,Alex Martelli 的食谱 1.4,也可以在这里在线找到:Add an entry to dictionary。过去的记忆是如此的不可靠!配方没有提到“慢”,甚至没有使用in,而是has_key。它只是说try: except: 更加 Pythonic(至少是食谱的书本版本)。感谢您的更正和答案。

【问题讨论】:

  • 不是骗子;这是关于defaultdict
  • key in d 并不慢,期间。如果你不这么说,你最好有确凿的证据。 timeit 表示它与成功的 d[key] 一样快,并且比 d[key] + except: pass 快得多(近 10 倍)(当然,如果密钥几乎总是,它可能比显式的 if 稍微快一点当下)。现在,key in d.keys() (Python 2.x) 或 key in list(d.keys()) (Python 3.x) 很慢,但这是因为它故意丢弃哈希表信息。
  • 必看 this answer.

标签: python dictionary defaultdict


【解决方案1】:

key in dct 必须要快,说慢就像说dct[key] 慢,绝对不能这样。在任何体面的字典实现中,从给定键的字典中检索元素并测试键的成员资格都必须是 O(1) 操作,并且很容易看出如何根据访问操作来实现成员资格操作。

对于defaultdict 的问题,只需使用in。而且没有理由避免在普通字典中使用in

【讨论】:

    【解决方案2】:

    如何在不更新默认字典的情况下执行查找?

    key in dct,即显式。

    如果这真的对你来说太贵了(衡量一下,你会确定的),有针对特定情况的解决方法。例如,如果您的默认值为'ham',并且在某些情况下您不想在找不到key 时将(key, 'ham') 存储在defaultdict 中,您可以这样做

    dct.get(key, 'ham')  # will return dct[key] or 'ham' but never stores anything
    

    【讨论】:

    • has_keykey in dct 弃用 - 请不要提倡使用旧习语。
    猜你喜欢
    • 2019-12-14
    • 1970-01-01
    • 2017-09-01
    • 2021-12-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-05-24
    相关资源
    最近更新 更多