18

在使用 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 Cookbook,Alex Martelli 的食谱 1.4,也可以在这里在线找到:Add an entry to dictionary。过去的记忆是如此的不可靠!该食谱没有提到“较慢”,甚至没有使用inbut has_key。它只是说它try: except:更像 Pythonic(至少是食谱的书本版本)。感谢您的更正和答案。

4

2 回答 2

26

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

key in dct即明确。

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

dct.get(key, 'ham')  # will return dct[key] or 'ham' but never stores anything
于 2012-01-28T17:39:50.180 回答
10

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

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

于 2012-01-28T17:55:22.227 回答