如果不存在,Python会在dict中更新密钥

时间:2017-02-18 12:23:26

标签: python dictionary

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

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

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

5 个答案:

答案 0 :(得分:47)

您无需致电d.keys(),所以

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

就够了。没有更清晰,更易读的方法。

您可以使用dict.get()再次更新,如果密钥已存在,则会返回现有值:

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

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

答案 1 :(得分:26)

使用dict.setdefault()

>>> d = {1: 'one'}
>>> d.setdefault(1, '1')
'one'
>>> d    # d has not changed because the key already existed
{1: 'one'}
>>> d.setdefault(2, 'two')
'two'
>>> d
{1: 'one', 2: 'two'}

答案 2 :(得分:24)

Python 3.9 起,您可以使用 merge运算符 \r合并两个字典。右侧的dict优先:

|

注意:这将使用更新后的值创建一个新字典。

答案 3 :(得分:6)

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

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

我用投票率最高的答案对其进行了测试,平均而言,这样做的速度更快,如下面的示例所示。

Speed test comparing a for loop based method with a dict comprehension with unpack operator 速度测试,将基于for循环的方法与带有unpack运算符方法的dict理解进行比较。

如果在第一种情况下没有复制(d = default_vals.copy()),则一旦我们达到10**5甚至更大的数量级,投票最多的答案就会更快。两种方法的内存占用都相同。

答案 4 :(得分:0)

根据以上答案setdefault()的方法对我有用。

old_attr_name = mydict.setdefault(key, attr_name)
if attr_name != old_attr_name:
    raise RuntimeError(f"Key '{key}' duplication: "
                       f"'{old_attr_name}' and '{attr_name}'.")

尽管此解决方案不是通用的。在这种情况下才适合我。确切的解决方案是首先检查key(正如已经建议的那样),但是使用setdefault()我们可以避免在字典上进行额外的查找,尽管它很小,但仍然可以提高性能。 / p>