Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/298.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
python映射中的派生值_Python_Function_Dictionary - Fatal编程技术网

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中的任何值,包括正常值和默认值中的特殊值,所以它可以变得像你想要的那样复杂。干得好。虽然我可能会为类使用不同的名称,以避免将其与。