python映射中的派生值
我不确定这个问题是否可行,但不管怎样,假设我有一些字典:python映射中的派生值,python,function,dictionary,Python,Function,Dictionary,我不确定这个问题是否可行,但不管怎样,假设我有一些字典: my_dict = {'a':0, 'b':1} my_dict['a'] = 2 在这个简单的例子中,我希望一些键“c”等于值a+b,这样,如果我要更新字典: my_dict = {'a':0, 'b':1} my_dict['a'] = 2 然后打电话: my_dict['c'] 将返回3 a=2+b=1 我找不到任何简单的方法,也许是lambda函数,但这似乎不正确。无论何时我想要a&b的总和,这都是有用的,我不必显式
my_dict = {'a':0, 'b':1}
my_dict['a'] = 2
在这个简单的例子中,我希望一些键“c”等于值a+b,这样,如果我要更新字典:
my_dict = {'a':0, 'b':1}
my_dict['a'] = 2
然后打电话:
my_dict['c']
将返回3 a=2+b=1
我找不到任何简单的方法,也许是lambda函数,但这似乎不正确。无论何时我想要a&b的总和,这都是有用的,我不必显式地将它们取出并相加
编辑:感谢您的快速响应,如果我一直知道C值,我希望执行一些函数,但我希望能够动态定义函数,那么这将适用于类,比方说,在我的字典里,我希望c是a+b,但在我的字典2中,我希望b键是a键*52/3或其他一些基本的数学运算。在下面的解决方案中,我必须继续重新编写类,我不希望这样。有什么想法吗?你不能用简单的听写,但你可以用一节课来做类似的事情:
class MyClass(object):
def __init__(self, a, b):
self.a = a
self.b = b
@property
def c(self):
return self.a + self.b
t = MyClass(2, 3)
print t.c
t.a = 10
print t.c
t.b = 5
print t.c
输出
通过实现一个简单类来解决的典型问题
class MyClass(object):
def __init__(self, a=None, b=None):
self.a = a
self.b = b
@property
def c(self):
return self.a + self.b
o = MyClass()
o.a = 1
o.b = 2
assert o.c == 3
o.a = 2
assert o.c == 4
如果必须是dict,则可以创建自定义类并重写_ugetItem _; magic方法
class MyDict(dict):
def __getitem__(self, key):
if key == 'c':
return self['a'] + self['b']
return super(MyDict, self).__getitem__(key)
my_dict = MyDict()
my_dict['a'] = 1
my_dict['b'] = 2
assert my_dict['c'] == 3
my_dict['b'] = 3
assert my_dict['c'] == 4
assert isinstance(my_dict, dict)
如果您想获得通用解决方案,我将采用以下方式:
class DefaultDict(dict):
defaults = {}
def __getitem__(self, key):
if key in self.defaults:
return self.defaults[key](self)
return super(DefaultDict, self).__getitem__(key)
def __setitem__(self, key, value):
if key in self.defaults:
raise RuntimeError('Default key: %s' % key)
super(DefaultDict, self).__setitem__(key, value)
# alt. 1
o1 = DefaultDict()
o1.defaults = {'c': lambda d: d['a'] + d['b']}
o1['a'] = 1
o1['b'] = 2
assert o1['c'] == 3
# alt. 2
class DefaultDict1(DefaultDict):
defaults = {'c': lambda d: d['a'] + d['b']}
o2 = DefaultDict1()
o2['a'] = 1
o2['b'] = 2
assert o2['c'] == 3
子类dict和override _getitem __;魔术函数:
class SumDict(dict):
SUM_KEY = 'c'
def __getitem__(self, key):
if key == self.SUM_KEY:
return sum(self.values())
return super(SumDict, self).__getitem__(key)
def __setitem__(self, key, val):
if key == self.SUM_KEY:
raise KeyError('{} key is reserved'.format(key))
super(SumDict, self).__setitem__(key, val)
-
我添加了更多的“通用”解决方案,希望您会喜欢。请注意,Łukasz R.的最新解决方案非常灵活:您可以随时向现有实例添加新函数,与默认值中的键关联的lambda函数可以访问dict中的任何值,包括正常值和默认值中的特殊值,所以它可以变得像你想要的那样复杂。干得好。虽然我可能会为类使用不同的名称,以避免将其与。