表示分支检查密钥是否存在于字典中的优雅方式

时间:2015-08-02 01:46:17

标签: python

在我的一些项目中,当我想根据键是否在字典中执行某些操作时,我会使用一种相当丑陋且简单的方法来进行分支,如果是这样的话,我最终会遇到很多类似的问题。 (在此示例中,我知道如果someDict包含密钥,someDict2也会这样做。

if someKey in someDict:
    someDict[someKey] += x
    someDict2[someKey] += y
else:
    someDict[someKey] = x
    someDict2[someKey] = y

我只是想知道,有更优雅的方式吗? setdefault()似乎不是一个答案,因为如果密钥存在,我想添加一些不依赖于当前存储的值。

3 个答案:

答案 0 :(得分:0)

如果xy是数字,则可以使用默认值为零的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}