我想创建一个字典,其中一个值依赖于同一个字典中的不同值。
通常的做法是:
>>> 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
答案 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}