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

如何在不更新字典(Python)的情况下检查defaultdict中的键?,python,dictionary,defaultdict,Python,Dictionary,Defaultdict,在使用Python字典时,我通常使用以下习惯用法: try: val = dct[key] except KeyError: print key, " is not valid" 因为对于大型词典来说 if key in dct: # do something 效率不是很高(所以我记得读过,但我在实践中也注意到了) 今天我使用的是defaultdict,有一刻我忘记了defaultdict不会给你一个键错误,而是会更新原始字典 如何在不更新defaultdict的情况

在使用Python字典时,我通常使用以下习惯用法:

try:
    val = dct[key]
except KeyError:
    print key, " is not valid"
因为对于大型词典来说

if key in dct:
    # do something
效率不是很高(所以我记得读过,但我在实践中也注意到了)

今天我使用的是defaultdict,有一刻我忘记了defaultdict不会给你一个键错误,而是会更新原始字典

如何在不更新defaultdict的情况下执行查找?我真的需要打印一个错误,以便用户可以重新输入密钥

谢谢大家!

更新:几张海报表明,我认为如果dct中的键:变慢,则认为
是错误的。我回去查看了我读过的那本书,那本书最好使用
try:except:
。这是Alex Martelli 2002年出版的Python食谱1.4,也可以在网上找到:。旧的记忆太不可靠了!配方中没有提到“较慢”,甚至没有在
中使用
,但
有_键
。它只是说
try:except:
更像Pythonic(至少是食谱的书本版)。谢谢你的更正和答案

如何在不更新defaultdict的情况下执行查找

使用
键输入dct
,即显式输入

如果这对你来说真的太贵了(衡量一下,你会确定的),那么在特定情况下有一些变通办法。例如,如果您的默认值是
'ham'
,并且在某些情况下,当未找到
键时,您不想将
(key,'ham')
存储在
defaultdict
中,您可以这样做

dct.get(key, 'ham')  # will return dct[key] or 'ham' but never stores anything
dct中的
键必须是快的,说慢就像说
dct[key]
慢一样,决不能是这样。在任何合适的字典实现中,从给定键的字典中检索元素和测试键的成员资格都必须是O(1)操作,并且很容易看出如何根据访问操作实现成员资格操作


有关
defaultdict
的问题,只需使用
中的
。在普通词典中,没有理由避免使用
;这是关于
defaultdict
输入d
不慢,句号。如果你不这么说,你最好有确凿的证据
timeit
说它和成功的
d[key]
一样快,比
d[key]
+
快很多(将近10倍),除了:pass
(当然,如果钥匙几乎总是存在,它可能比显式的
稍快一些)。现在,
key-in d.keys()
(Python 2.x)或
key-in-list(d.keys())
(Python 3.x)的速度很慢,但这是因为它故意丢弃哈希表信息。必须看到。
has_-key
被弃用,取而代之的是
key-in-dct
——请不要提倡使用老习惯用法。