如何在不更新字典的情况下检查defaultdict中的键(Python)?

问题描述 投票:0回答:3

在使用 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(至少是食谱的书本版本)。感谢您的指正和解答。

python dictionary defaultdict
3个回答
28
投票

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

key in dct
,即明确。

如果这对您来说“真的”太贵(测量一下就可以确定),有针对特定情况的解决方法。例如,如果您的默认值为 'ham',并且在某些情况下,当未找到

(key, 'ham')
时,您不想将
defaultdict
存储在
key
中,则可以这样做

dct.get(key, 'ham') # will return dct[key] or 'ham' but never stores anything



11
投票
key in dct

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

对于带有

defaultdict

的问题,只需使用

in
。在普通字典中没有理由避免使用
in
    


0
投票
我们的

代码中!) 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"

© www.soinside.com 2019 - 2024. All rights reserved.