3

这是我的字典:

Health = {'John' : 100}

我想要做的是,我想将一个值的最大数量设置为 100。所以,如果我输入:

Health['John'] += 10
print Health

打印时,我希望“John”的值为 100,因为该值可以是 100。如果代码是:

Health = {'John' : 90}

Health['John'] += 12
print Health

我希望它打印 'John' : 100,因为最大值是 100。明白吗?谢谢

4

4 回答 4

6

您可以创建自己的 dict 子类:

class Mydict(dict):
    def __setitem__(self, key, val):
        super(Mydict, self).__setitem__(key, min(val, 100))
...         
>>> d = Mydict({'john': 100})
>>> d['john'] += 12
>>> d
{'john': 100}
>>> d['foo'] = 90
>>> d
{'john': 100, 'foo': 90}
>>> d['foo'] += 12
>>> d
{'john': 100, 'foo': 100}
于 2013-09-07T17:32:46.490 回答
4

您可以为此创建一个特殊dict的:

class CappedDict(dict):
  def __init__(self, cap):
    self.cap = cap
  def __setitem__(self, key, value):
    dict.__setitem__(self, key, min(value, self.cap))

d = CappedDict(100)
print d
d['Harry'] = 90
print d
d['Harry'] += 20
print d
于 2013-09-07T17:32:56.583 回答
2

除非您将dict. 通过让函数实现逻辑,我将获得相同的功能:

这些方面的东西:

def add_to_health_with_max(dict,key,value,max_value):
    added = value + dict[key]
    if added > max_value:
        age = max_value
    else:
        age = added
    dict[key] = age
    return age

现在

health = {'John' : 60}
print add_to_dict(health,'John',12,100)
print add_to_dict(health,'John',120,100)
print health

返回:

72
100
{'John': 100}

现在您仍在使用普通的旧字典。

可以创建自己的类,通过覆盖来实现您所描述的行为__setitem____getattr__或两者兼而有之(Ashwini Chaudhary 详细说明了您将如何做到这一点),但我怀疑这会矫枉过正并损害可重复性。

是继承dict还是使用函数

询问最好的方法是什么是一个合理的问题 - 这种方法(编写一个函数以特定方式添加到您的 dicts)或子类化 dict 给您一个具有您想要的特定行为的对象。

在您的应用程序上下文之外很难回答这个问题,对于一个将在本地使用此逻辑的小型应用程序,如果您在许多不同的地方需要此功能并且想要传递这些字典,我会采用上述方法建议的 OOP 方法可能更有用。

于 2013-09-07T17:27:04.610 回答
0

这是一个非常简单的方法:

def value(h):
if h > 100:
    return 100
return h

我将最大值设置为 100。如果数字是 150,它将返回 100。

于 2013-12-22T15:49:22.683 回答