如果不存在,Python 将更新 dict 中的键

我想在 dict.keys ()中插入一个键值对(如果 key 不在 dict.keys ()中)。 基本上我可以这样做:

if key not in d.keys():
d[key] = value

但是有没有更好的方法呢? 或者这个问题的 Python 解决方案是什么呢?

282117 次浏览

您不需要调用 d.keys(),因此

if key not in d:
d[key] = value

没有更清晰、更易读的方法了。

您可以再次使用 dict.get()进行更新,如果键已经存在,它将返回一个现有的值:

d[key] = d.get(key, value)

但是我强烈建议不要这样做; 这是代码高尔夫,妨碍了维护和可读性。

使用 dict.setdefault():

>>> d = {'key1': 'one'}
>>> d.setdefault('key1', 'some-unused-value')
'one'
>>> d    # d has not changed because the key already existed
{'key1': 'one'}
>>> d.setdefault('key2', 'two')
'two'
>>> d
{'key1': 'one', 'key2': 'two'}

使用以下命令,您可以插入多个值,也可以使用默认值,但是您正在创建一个新字典。

d = {**{ key: value }, **default_values}

我已经用投票最多的答案测试过了,平均来说这个速度更快,因为它可以在下面的例子中看到。

Speed test comparing a for loop based method with a dict comprehension with unpack operator 速度测试比较一个为循环的方法和一个字典理解与解包算子方法。

如果第一种情况下没有复制(d = default_vals.copy()) ,那么当我们达到数量级 10**5或更高时,最多投票的答案会更快。两个方法的内存占用是相同的。

由于 Python 3.9你可以使用 合并操作员 |来合并两个字典。右边的字典优先:

new_dict = old_dict | { key: val }

例如:

new_dict = { 'a': 1, 'b': 2 } | { 'b': 42 }


print(new_dict) # {'a': 1, 'b': 42}

注意: 这将创建一个带有更新值的新字典。

您也可以只在一行代码中使用此解决方案:

dict[dict_key] = dict.get(dict_key,value)

dict.get的第二个参数是在密钥不存在的情况下要分配给密钥的值。因为这是在分配给 dict[dict_key] = 之前计算的,所以我们可以确定当我们尝试访问它时它们的键将存在。