在我的一些项目中,当我想根据键是否在字典中执行某些操作时,我会使用一种相当丑陋且简单的方法来进行分支,如果是这样的话,我最终会遇到很多类似的问题。 (在此示例中,我知道如果someDict
包含密钥,someDict2
也会这样做。
if someKey in someDict:
someDict[someKey] += x
someDict2[someKey] += y
else:
someDict[someKey] = x
someDict2[someKey] = y
我只是想知道,有更优雅的方式吗? setdefault()
似乎不是一个答案,因为如果密钥存在,我想添加一些不依赖于当前存储的值。
答案 0 :(得分:0)
如果x
和y
是数字,则可以使用默认值为零的get
:
someDict[someKey] = someDict.get(someKey, 0) + x
someDict2[someKey] = someDict2.get(someKey, 0) + y
如果在创建x
时知道someDict
,那么您可以使用collections.defaultdict:
import collections
someDict = collections.defaultdict(lambda: x)
someDict[someKey] += x
(和fo someDict2
类似。)
答案 1 :(得分:0)
对于这个逻辑:
if someKey in someDict:
someDict[someKey] += x
someDict2[someKey] += y
else:
someDict[someKey] = x
someDict2[someKey] = y # even if somekey was already in y
有更优雅的方式吗?
不,没有更高效或Pythonic的方式来执行这些精确的语义。您想要检查someDict
的内存,这将影响您对两个dicts的处理方式。这是不可能进一步简化的。
答案 2 :(得分:0)
您可以使用专用方法扩展dict类来处理if / then
class my_dict(dict):
def add(self, key, value):
if key in self:
self[key] += value
else:
self[key] = value
someDict = my_dict()
someDict2 = my_dict()
someDict.add('a', 3) # {'a': 3}
someDict2.add('a', 4) # {'a': 4}
someDict.add('a', 2) # {'a': 5}
someDict2.add('a', 2) # {'a': 6}
someDict.add('b', 10) # {'a': 5, 'b': 10}
someDict2.add('b', 20) # {'a': 6, 'b': 20}