如何在Python的defaultdict中检查一个键而不更新字典?

12 浏览
0 Comments

如何在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的风格(至少是书中的版本)。感谢纠正和回答。

0
0 Comments

在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`来确定键是否存在。

通过这种方式,我们可以避免不必要的双重检查,提高代码的效率。

0
0 Comments

在Python中,要检查一个键是否存在于字典中,通常我们会使用key in dct的方式。但有时候我们希望在不更新字典的情况下进行这个检查。下面是问题的原因和解决方法。

问题的原因是key in dct这种方式在defaultdict中会有一些问题。defaultdict是字典的一个子类,它允许我们在访问一个不存在的键时,返回一个指定的默认值。然而,defaultdict的实现方式导致key in dct的速度变慢。

解决方法很简单,对于defaultdict,我们可以直接使用in来检查键是否存在。而对于普通的字典,也没有任何理由避免使用in来检查键是否存在。

无论是使用defaultdict还是普通的字典,在检查键是否存在时,都可以直接使用in来进行判断。这样可以保证检查的速度是O(1)的,即使在defaultdict中也是如此。

0
0 Comments

问题的出现原因是:在使用 defaultdict 时,如何检查一个 key 是否存在于字典中,而不会触发默认值的更新。

解决方法是:

- 使用 key in dct 来显式地进行查找。

- 如果这种方法对性能要求非常高的话,可以根据具体情况使用一些特定的解决方案。

- 例如,如果默认值是 'ham',并且在某些情况下当 key 不存在时不想将 (key, 'ham') 存储在 defaultdict 中,可以使用 dct.get(key, 'ham') 来获取值,这样不会触发任何存储操作。

- 注意,has_key 方法已经被弃用,推荐使用 key in dct 来判断 key 是否存在于字典中。请不要使用过时的用法。

0