Назначение внутри лямбда-выражения в Python - PullRequest
88 голосов
/ 08 июня 2011

У меня есть список объектов, и я хочу удалить все пустые объекты, кроме одного, используя filter и выражение lambda.

Например, если ввод:

[Object(name=""), Object(name="fake_name"), Object(name="")]

... тогда результат должен быть:

[Object(name=""), Object(name="fake_name")]

Есть ли способ добавить присваивание к выражению lambda? Например:

flag = True 
input = [Object(name=""), Object(name="fake_name"), Object(name="")] 
output = filter(
    (lambda o: [flag or bool(o.name), flag = flag and bool(o.name)][0]),
    input
)

Ответы [ 12 ]

3 голосов
/ 08 июня 2011

Нет, вы не можете поместить назначение в лямбду из-за его собственного определения. Если вы работаете с использованием функционального программирования, вы должны предположить, что ваши значения не изменяемы.

Одним из решений будет следующий код:

output = lambda l, name: [] if l==[] \
             else [ l[ 0 ] ] + output( l[1:], name ) if l[ 0 ].name == name \
             else output( l[1:], name ) if l[ 0 ].name == "" \
             else [ l[ 0 ] ] + output( l[1:], name )
0 голосов
/ 31 января 2013

во-первых, вам не нужно использовать локальное назначение для вашей работы, просто проверьте ответ выше

во-вторых, его просто использовать locals () и globals (), чтобы получить таблицу переменных, а затем изменитьзначение

проверьте этот пример кода:

print [locals().__setitem__('x', 'Hillo :]'), x][-1]

если вам нужно изменить добавить глобальную переменную в вашу среду, попробуйте заменить locals () на globals ()

Список компоновок Python - это круто, но большая часть условного проекта не принимает это (например, flask: [)

надеюсь, что это может помочь

...