如果键不在dict.keys()中,我想将一个键值对插入dict中。基本上我可以做到:
if key not in d.keys():
d[key] = value
但是有更好的方法吗?或针对此问题的pythonic解决方案是什么?
Answers:
>>> 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'}
dict.setdefault()
也应该仅在尝试访问该值时才使用。
setdefault()
清楚地描述了正在发生的事情-它也返回一个值并不重要,而且IMO有点古怪。您能否提供一个快速的解释或链接,以了解为什么不希望这样做?
for obj in iterable: d.setdefault(key_for_obj(obj), []).append(obj)
。返回的值没有任何古怪之处,这就是方法的重点。
if key not in d:
测试即可。
setdefault()
似乎确实适合您所说的内容。使用adefaultdict(list)
比代码示例更具可读性...因此,除非有人必须使用标准字典,否则可能没有用。总体而言,if key not in d
更为清晰。
从Python 3.9开始,您可以使用merge运算 |
符合并两个字典。右侧的dict优先:
new_dict = old_dict | { key: val }
例如:
new_dict = { 'a': 1, 'b': 2 } | { 'b': 42 }
print(new_dict} # {'a': 1, 'b': 42}
注意:这将创建具有更新值的新字典。
{**default_values, **{ key: value }}
根据以上答案,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()
我们避免在字典上进行额外的查找,即虽然很小,但仍然可以提高性能。