使用Python字典时,我通常使用以下习惯用法:
try:
val = dct[key]
except KeyError:
print key, " is not valid"
因为对于大型词典,语句
if key in dct:
# do something
效率不高(所以我记得读书,但我在实践中也注意到了它)
今天我正在使用defaultdict,有一会儿我忘记了defaultdict永远不会给你一个KeyError,而是会更新原始字典。
如何在不更新defaultdict的情况下执行查找?我真的需要打印一个错误,以便用户可以重新输入密钥。
谢谢!
更新:有几张海报表明我认为if key in dct:
速度慢的说法是错误的。我回去检查了我读过的书,最好使用try: except:
。它是2002年的Python Cookbook,Alex Martelli的Recipe 1.4,也可以在这里找到:Add an entry to dictionary。旧的记忆是如此不可靠!配方没有提到“慢”,甚至没有使用in
而是has_key
。它只是说try: except:
更像是Pythonic(至少是配方的书籍版本)。感谢您的纠正和答案。
答案 0 :(得分:20)
如何在不更新defaultdict的情况下执行查找?
使用key in dct
,即明确。
如果确实对你来说太贵了(措施并且你肯定会有),那么就有针对特定情况的解决方法。例如,如果您的默认值为'ham'
,并且在某些情况下,当您找不到(key, 'ham')
时,您不希望defaultdict
存储key
,那么您可以
dct.get(key, 'ham') # will return dct[key] or 'ham' but never stores anything
答案 1 :(得分:9)
key in dct
有快,说这很慢就像说dct[key]
很慢,而且绝不应该这样。在给定密钥和测试密钥成员资格的情况下从字典中检索元素必须是任何体面的字典实现中的O(1)操作,并且很容易看到如何在访问操作方面实现成员资格操作。
对于defaultdict
的问题,请使用in
。并且没有理由避免在普通字典中使用in
。