在使用 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:
。这是 Alex Martelli 于 2002 年出版的 Python Cookbook,Recipe 1.4,也可以在此处在线找到:向字典添加条目。旧时的记忆太不可靠了!食谱中没有提到“慢一点”,甚至没有使用in
,而是使用has_key
。它只是说 try: except:
更Pythonic(至少是食谱的书本版本)。感谢您的指正和解答。
如何在不更新默认字典的情况下执行查找?
与
key in dct
,即明确。
如果这对您来说“真的”太贵(测量一下就可以确定),有针对特定情况的解决方法。例如,如果您的默认值为 'ham'
,并且在某些情况下,当未找到
(key, 'ham')
时,您不想将 defaultdict
存储在 key
中,则可以这样做dct.get(key, 'ham') # will return dct[key] or 'ham' but never stores anything
key in dct
has要快,说它慢就像说
dct[key]
慢一样,而且绝对不能是这样。在任何像样的字典实现中,从给定键的字典中检索元素并测试键的成员资格都必须是 O(1) 操作,并且很容易看出如何根据访问操作来实现成员资格操作。对于带有
defaultdict
的问题,只需使用
in
。在普通字典中没有理由避免使用 in
。代码中!)
val = dct.get(key, None)
if val is None:
print key, " is not valid"
如果
None
是有效条目,则:
MISSING = object()
val = dct.get(key, MISSING)
if val is MISSING:
print key, " is not valid"