如何在Python的defaultdict中检查一个键而不更新字典?
如何在Python的defaultdict中检查一个键而不更新字典?
当我使用Python字典时,通常会使用以下习语:\n
try: val = dct[key] except KeyError: print key, " 不是有效的"
\n因为对于大型字典来说,语句\n
if key in dct: # 做一些操作
\n效率不是很高(我记得读过,实践中也注意到了)\n今天我在使用defaultdict时,一时忘记了defaultdict永远不会引发KeyError,而是会更新原始字典。\n我如何在不更新defaultdict的情况下执行查找?我真的需要打印错误,以便用户可以重新输入键。\n谢谢!\n更新:几位用户建议我关于if key in dct:
的观点是错误的。我回头检查了我曾经读过的书,书中提到最好使用try: except:
。这本书是2002年的《Python Cookbook》,第1.4章,作者是Alex Martelli,也可以在这里在线找到:向字典添加条目。旧的记忆是如此不可靠!这个示例没有提到\"更慢\",甚至没有使用in
而是has_key
。它只是说try: except:
更符合Python的风格(至少是书中的版本)。感谢纠正和回答。
在Python中,有时候我们需要检查字典中是否存在某个键,但又不希望在检查的过程中更新字典。下面是一个例子:
val = dct.get(key, None) if val is None: print key, " is not valid"
上述代码首先使用`get()`方法从字典中获取键对应的值,如果键不存在,则返回`None`。接着通过判断`val`是否为`None`来确定键是否存在。
然而,如果`None`是字典中的一个有效值,那么上述方法就无法准确判断键是否存在。为了解决这个问题,可以使用一个占位对象来代替`None`,如下所示:
MISSING = object() val = dct.get(key, MISSING) if val is MISSING: print key, " is not valid"
上述代码中,我们定义了一个名为`MISSING`的占位对象,然后使用`get()`方法获取键对应的值,如果键不存在,则返回`MISSING`。最后通过判断`val`是否为`MISSING`来确定键是否存在。
通过这种方式,我们可以避免不必要的双重检查,提高代码的效率。
在Python中,要检查一个键是否存在于字典中,通常我们会使用key in dct
的方式。但有时候我们希望在不更新字典的情况下进行这个检查。下面是问题的原因和解决方法。
问题的原因是key in dct
这种方式在defaultdict
中会有一些问题。defaultdict
是字典的一个子类,它允许我们在访问一个不存在的键时,返回一个指定的默认值。然而,defaultdict
的实现方式导致key in dct
的速度变慢。
解决方法很简单,对于defaultdict
,我们可以直接使用in
来检查键是否存在。而对于普通的字典,也没有任何理由避免使用in
来检查键是否存在。
无论是使用defaultdict
还是普通的字典,在检查键是否存在时,都可以直接使用in
来进行判断。这样可以保证检查的速度是O(1)的,即使在defaultdict
中也是如此。
问题的出现原因是:在使用 defaultdict 时,如何检查一个 key 是否存在于字典中,而不会触发默认值的更新。
解决方法是:
- 使用 key in dct
来显式地进行查找。
- 如果这种方法对性能要求非常高的话,可以根据具体情况使用一些特定的解决方案。
- 例如,如果默认值是 'ham',并且在某些情况下当 key 不存在时不想将 (key, 'ham') 存储在 defaultdict 中,可以使用 dct.get(key, 'ham')
来获取值,这样不会触发任何存储操作。
- 注意,has_key
方法已经被弃用,推荐使用 key in dct
来判断 key 是否存在于字典中。请不要使用过时的用法。