如何计算字典中的值?

问题描述 投票:0回答:3

我有字典(d)。我想将此字典与ab的不同值一起使用。

如何在不再次调用整个词典的情况下更新词典的输出?

a=1
b=2
d = {'value_1': a+b , 'value_2':a-b}
python dictionary
3个回答
1
投票

根据您对我的first answer的反馈,听起来您想要的东西或多或少像电子表格一样。下面是如何实现一个非常类似于字典的方法。它基于Raymond Hettinger的ActiveState recipe(具有一些修改和扩展名)。

请注意,除了在创建类的实例时传递关键字参数的特殊情况外,其中的值都应为字符串,而不是数字值。

还请注意,由于它使用eval(),因此出于安全目的,仅应与来自受信任源的输入一起使用。

[我认为重要的是要理解,尽管下面介绍的Spreadsheet类在技术上不是字典,但它的行为很像(一个子类),如果使用它代替常规字典,将为您提供所需的功能。请参阅在线文档的词汇表中对mapping的描述。

from collections.abc import MutableMapping

class SpreadSheet(MutableMapping):
    def __init__(self, tools=None, **kwargs):
        self._cells = {}
        for key, value in kwargs.items():
            self._cells[key] = value if isinstance(value, str) else str(value)
        self._tools = {'__builtins__': None}  # Prevent eval() from supplying.
        if tools is not None:
            self._tools.update(tools)  # Add any caller-supplied functions.

    def clear(self):
        return self._cells.clear()

    def copy(self):
        return self._cells.copy()

    def __contains__(self, key):
        return key in self._cells

    def __setitem__(self, key, formula):
        self._cells[key] = formula

    def __getitem__(self, key):
        return eval(self._cells[key], self._tools, self)

    def __len__(self):
        return len(self._cells)

    def __iter__(self):
        return iter(self._cells)

    def __delitem__(self, key):
        del self._cells[key]

    def getformula(self, key):
        """ Return raw un-evaluated contents of cell. """
        return self._cells[key]

    def update(self, *args, **kwargs):
        for k, v in dict(*args, **kwargs).items():
            self[k] = v

样本用法:

d = SpreadSheet(a=1, b=2)
d.update({'x': 'x1',
          'x1': 'a+2',
          'x2': 'b+1',
          'x3': 'a+b'})
xx = d['x']
print(xx)  # -> 3


1
投票

您可以通过将functions >>存储在单独的字典中,然后通过对其进行评估来创建新字典。

这是一个简单的示例,说明了我的建议:

funcs = {'value_1': lambda: a+b,
         'value_2': lambda: a-b}

a=1
b=2
d = {k: v() for k, v in funcs.items()}
print(d)  # -> {'value_1': 3, 'value_2': -1}

a=3
b=5
d = {k: v() for k, v in funcs.items()}
print(d)  # -> {'value_1': 8, 'value_2': -2}


0
投票

这是您想要的吗?


0
投票

根据您对我的first answer的反馈,听起来您想要的东西或多或少像电子表格一样。下面是如何实现一个非常类似于字典的方法。它基于Raymond Hettinger的ActiveState recipe(具有一些修改和扩展名)。

热门问题
推荐问题
最新问题