我发现自己在很多情况下都有一个想要用新值更新的字典值,但前提是新值满足与当前值相关的某些标准(例如更大)。
目前我写的表达式类似于:
dictionary[key] = max(newvalue, dictionary[key])
效果很好,但我一直认为可能有一种更简洁的方法可以做到这一点,而无需重复自己。
感谢您的任何建议。
我发现自己在很多情况下都有一个想要用新值更新的字典值,但前提是新值满足与当前值相关的某些标准(例如更大)。
目前我写的表达式类似于:
dictionary[key] = max(newvalue, dictionary[key])
效果很好,但我一直认为可能有一种更简洁的方法可以做到这一点,而无需重复自己。
感谢您的任何建议。
您可以使用封装该逻辑的更新方法创建值对象。或子类化字典并修改__setitem__
. 请记住,您这样做的任何事情都会使不熟悉您的代码的人不太清楚发生了什么。你现在做的事情是最明确和最清楚的。
只需为自己编写一个辅助函数:
def update(dictionary, key, newvalue, func=max):
dictionary[key] = func(dictionary[key], newvalue)
不确定它是否“更整洁”,但避免重复自己的一种方法是使用面向对象的方法并将内置类子类化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
如何使用 Python 版本的三元运算符:
d[key]=newval if newval>d[key] else d[key]
或单行,如果:
if newval>d[key]: d[key]=newval