在创建之前引用字典值

时间:2018-04-06 09:00:18

标签: python

我想创建一个字典,其中一个值依赖于同一个字典中的不同值。

通常的做法是:

>>> my_dict = {'quantity': 10}
>>> my_dict.update({'total': my_dict['quantity'] * 20})
>>> my_dict
{'quantity': 10, 'total': 200}

有没有办法用一个声明来做到这一点? 这是我认为可行的,但没有:

>>> my_dict = {'quantity': 10, 'total': my_dict['quantity'] * 20}
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
NameError: name 'my_dict' is not defined

2 个答案:

答案 0 :(得分:2)

您可以创建自己的词典:

class MyDict(dict):
    def __init__(self, *args, **kwargs):
        super().__init__(*args, **kwargs)
        if 'quantity' in self:
            self['total'] = self['quantity'] * 20

然后这将按你的意愿工作:

>>> d = MyDict(quantity=10)
>>> d
{'quantity': 10, 'total': 200}

当然,任何人都可以将total更改为他们想要的任何内容,而不管quantity。您可以覆盖update__setitem__以阻止直接分配total(并在quantity更改时自动更新),或者您可能希望查看property }。

如果你想在创建字典时传递函数来计算total,就像在你的例子中一样,你可以有一个参数:

class MyDict(dict):
    def __init__(self, *args, **kwargs):
        self.total_function = kwargs.pop('total_function', lambda x: x)
        super().__init__(*args, **kwargs)
        if 'quantity' in self:
            self['total'] = self.total_function(self['quantity'])

>>> d = MyDict(quantity=10)
>>> d
{'quantity': 10, 'total': 10}
>>> d = MyDict(quantity=10, total_function=lambda x: x * 20)
>>> d
{'quantity': 10, 'total': 200}

答案 1 :(得分:1)

如果您事先在变量中保存/保存值并使用:

,则它可以正常工作
n = 10
d = {'quantity': n, 'total': n * 20}