Angular (v2.4.5): невозможно связать с 'ngTemplateOutletContext', поскольку оно не известно как свойство 'ng-container'

Решение (лучше всего, если у вас есть повторяющееся значение x) было бы memoize функции f, т. е. создать функцию-оболочку, которая сохраняет аргумент, по которому вызывается функция, и сохраняет его, а не возвращает его, если тот же .

действительно простая реализация заключается в следующем:

storage = {}
def memoized(value):
    if value not in storage:
        storage[value] = f(value)
    return storage[value]

[memoized(x) for x in l if memoized(x)]

, а затем использовать эту функцию в понимании списка. Этот подход справедлив в двух условиях: один теоретический и один практический. Первый заключается в том, что функция f должна быть детерминированной, т. Е. Возвращает те же результаты при одном и том же входе, а другая в том, что объект x можно использовать в качестве словарных клавиш. Если первый из них недействителен, вы должны перепроверить f каждый раз по определению, а если второй не удастся, можно использовать несколько более надежные подходы.

Вы можете найти много реализаций memoization net, и я думаю, что в новых версиях python есть что-то, что включено в них.

На боковой ноте никогда не используйте маленький L в качестве имени переменной, это плохая привычка, поскольку ее можно смутить с i или 1 на некоторых терминалах.

EDIT:

, как прокомментировано, возможным решением с использованием генераторов (чтобы избежать создания бесполезных дублированных времен) было бы это выражение:

[g(x, fx) for x, fx in ((x,f(x)) for x in l) if fx]

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

1
задан cgTag 16 January 2019 в 15:21
поделиться