如何在不更新字典(Python)的情况下检查defaultdict中的键?

Lej*_*lek 15 python dictionary defaultdict

使用Python字典时,我通常使用以下习语:

try:
    val = dct[key]
except KeyError:
    print key, " is not valid"
Run Code Online (Sandbox Code Playgroud)

因为对于大型词典而言

if key in dct:
    # do something
Run Code Online (Sandbox Code Playgroud)

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

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

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

谢谢!

更新:几张海报表明我的信念if key in dct:很慢是错误的.我回去检查了我读过的最好用的书try: except:.它是2002年的Python Cookbook,Alex Martelli的Recipe 1.4,也可以在这里找到:在词典中添加一个条目.旧的记忆是如此不可靠!配方中没有提到"慢",它甚至没有使用in,但has_key.它只是说它try: except:更像Pythonic(至少是配方的书籍版本).感谢您的纠正和答案.

Fre*_*Foo 21

如何在不更新defaultdict的情况下执行查找?

key in dct,即明确.

如果这对你来说真的太贵了(措施而且你肯定会有),那么就有针对特定情况的解决方法.例如,如果您的默认值'ham',并在某些情况下,你不希望存储(key, 'ham')defaultdictkey没有找到,你可以做

dct.get(key, 'ham')  # will return dct[key] or 'ham' but never stores anything
Run Code Online (Sandbox Code Playgroud)

  • 不推荐使用`has_key`以支持'dct`中的键 - 请不要推广使用旧的习语. (9认同)

Ósc*_*pez 9

key in dct 必须要快,说这很慢就像说那么dct[key]慢,而且绝不应该这样.在给定密钥和测试密钥成员资格的情况下从字典中检索元素必须是任何体面的字典实现中的O(1)操作,并且很容易看到如何在访问操作方面实现成员资格操作.

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