如何:
dict = {}
if key not in dict:
dict[key] = foo
比较:
try:
dict[key]
except KeyError:
dict[key] = foo
即,通过dict.keys()
进行线性搜索比检查密钥更快,我认为第一种形式会做什么?
答案 0 :(得分:5)
您正在寻找setdefault方法:
>>> r = {}
>>> r.setdefault('a', 'b')
'b'
>>> r
{'a': 'b'}
>>> r.setdefault('a', 'e')
'b'
>>> r
{'a': 'b'}
答案 1 :(得分:5)
只是澄清一点:if key not in d
不通过d键进行线性搜索。它使用dict的哈希表来快速找到密钥。
答案 2 :(得分:4)
尝试:my_dict.setdefault(key, default)
。不过,它比其他选项略慢。
如果
key
在字典中,则返回其值。如果没有,请插入值key
的{{1}}并返回default
。default
默认为无。
default
答案 3 :(得分:4)
答案取决于密钥已经在密码中的频率(顺便说一句,有人向你提到隐藏变量后面的内置文件如dict
有多糟糕吗?)
if key not in dct:
dct[key] = foo
如果密钥在字典中,则执行一次字典查找。如果密钥在字典中,它会查找字典两次。
try:
dct[key]
except KeyError:
dct[key] = foo
对于密钥在字典中的情况,这可能稍快一些,但抛出异常会产生相当大的开销,因此它几乎总是不是最佳选择。
dct.setdefault(key, foo)
这个有点棘手:它总是涉及两个字典查找:第一个是在setdefault
类中查找dict
方法,第二个是在key
中查找dct
foo
对象。此外,如果collections.defaultdict
是表达式,则每次都会对其进行评估,而之前的选项仅在必要时对其进行评估。
另请参阅{{1}}。对于像这样的大类情况,这是最合适的解决方案。
答案 4 :(得分:-1)
my_dict.get(key, foo)
返回foo。默认值为None,因此如果key不在my_dict中,my_dict.get(key)
将返回None。如果您只想将密钥添加到字典中,则第一个选项会更好。这里不要担心速度。如果您发现填充字典是程序中的热点,那么请考虑一下。但事实并非如此。所以不要。