Как оценить значения в словаре? - PullRequest
0 голосов
/ 12 февраля 2020

У меня есть словарь (d). Я хочу использовать этот словарь с разными значениями для a и b.

Как я могу обновить вывод словаря без повторного вызова всего словаря?

a=1
b=2
d = {'value_1': a+b , 'value_2':a-b}

Ответы [ 3 ]

1 голос
/ 12 февраля 2020

Вы можете сделать это, сохранив функции в отдельном словаре, а затем создать новые, оценив его.

Вот простой пример, иллюстрирующий то, что я предлагаю:

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}

1 голос
/ 12 февраля 2020

Исходя из вашего отзыва на мой первый ответ , звучит так, как будто вы хотите, что-то более или менее похожее на электронную таблицу. Ниже описано, как реализовать такой словарь. Он основан на ActiveState Рэймонда Хеттингера с этим именем с некоторыми изменениями и расширениями.

Обратите внимание, что за исключением особого случая аргументов ключевых слов, передаваемых при создании экземпляра класса, значения в нем должны быть все строки , а не числовые значения.

Также обратите внимание, что поскольку он использует eval(), в целях безопасности его следует использовать только с входными данными из надежных источников.

Я думаю, что важно понимать, что, хотя класс Spreadsheet, представленный ниже, технически не является словарем, он ведет себя во многом как (подкласс) и, если он используется вместо обычного словаря, даст вам возможности, которые вы хотеть. См. Описание отображение в глоссарии онлайн-документации.

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

0 голосов
/ 12 февраля 2020

Это то, что вы хотите?

>>> from operator import add, sub
>>> d = {'value_1': add , 'value_2': sub}
>>> new_dict = {'value_1' : d['value_1'](1, 2), 'value_2' : d['value_2'](1, 2)}
>>> new_dict
{'value_1': 3, 'value_2': -1}
...