【发布时间】:2012-01-28 17:36:30
【问题描述】:
在使用 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:。这是 2002 年的 Python 食谱,Alex Martelli 的食谱 1.4,也可以在这里在线找到:Add an entry to dictionary。过去的记忆是如此的不可靠!配方没有提到“慢”,甚至没有使用in,而是has_key。它只是说try: except: 更加 Pythonic(至少是食谱的书本版本)。感谢您的更正和答案。
【问题讨论】:
-
不是骗子;这是关于
defaultdict。 -
key in d并不慢,期间。如果你不这么说,你最好有确凿的证据。timeit表示它与成功的d[key]一样快,并且比d[key]+except: pass快得多(近 10 倍)(当然,如果密钥几乎总是,它可能比显式的if稍微快一点当下)。现在,key in d.keys()(Python 2.x) 或key in list(d.keys())(Python 3.x) 很慢,但这是因为它故意丢弃哈希表信息。 -
必看 this answer.
标签: python dictionary defaultdict