当更新依赖于值本身时,是否有更新字典值的pythonic方法?

时间:2012-05-25 15:56:00

标签: python

我发现自己处于很多情况下,我有一个字典值,我想用新值更新,但前提是新值符合相对于当前值的某些条件(例如更大)。

目前我写的表达式类似于:

dictionary[key] = max(newvalue, dictionary[key])

工作正常,但我一直认为可能有一种更简洁的方法,不涉及重复自己。

感谢您的任何建议。

4 个答案:

答案 0 :(得分:3)

您可以使用封装该逻辑的更新方法来创建值对象。或子类字典并修改__setitem__的行为。只要记住你做的任何事情,这会让那些不熟悉你的代码的人不那么清楚。你现在正在做的事情是最清楚明确的。

答案 1 :(得分:1)

给自己写一个辅助函数:

def update(dictionary, key, newvalue, func=max):
    dictionary[key] = func(dictionary[key], newvalue)

答案 2 :(得分:1)

不确定它是否“整洁”,但是避免重复自己的一种方法是使用面向对象的方法并将内置的dict类子类化,以使某些东西能够做你想要的。这样做的另一个好处是,您可以使用自定义类的实例代替dict个实例,而无需更改其余代码。

class CmpValDict(dict):
    """ dict subclass that stores values associated with each key based
       on the return value of a function which allow the value passed to be
       first compared to any already there (if there is no pre-existing
       value, the second argument passed to the function will be None)
    """
    def __init__(self, cmp=None, *args, **kwargs):
        self.cmp = cmp if cmp else lambda nv,cv: nv  # default returns new value
        super(CmpValDict, self).__init__(*args, **kwargs)

    def __setitem__(self, key, value):
        super(CmpValDict, self).__setitem__(key, self.cmp(value, self.get(key)))

cvdict = CmpValDict(cmp=max)

cvdict['a'] = 43
cvdict['a'] = 17
print cvdict['a']  # 43

cvdict[43] = 'George Bush'
cvdict[43] = 'Al Gore'
print cvdict[43]  # George Bush

答案 3 :(得分:0)

如何使用Python版本的三元运算符:

d[key]=newval if newval>d[key] else d[key]

或一行如果:

if newval>d[key]: d[key]=newval