我有一个对象列表,我想使用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
)
不能在
filter
/lambda
表达式中真正维护状态(除非滥用全局命名空间)。但是,您可以使用在reduce()
表达式中传递的累积结果来实现类似的功能:当然,你可以稍微调整一下。在这种情况下,它过滤掉重复项,但是您也可以使用
a.count("")
,例如,仅限制空字符串。不用说,你可以这么做,但你真的不应该这样做
最后,您可以用纯Python做任何事情
lambda
:http://vanderwijk.info/blog/pure-lambda-calculus-python/The assignment expression operator ^{} added in Python 3.8 支持lambda表达式内部的赋值。出于语法原因,此运算符只能出现在带括号的
(...)
、带括号的[...]
或带括号的{...}
表达式中。例如,我们将能够编写以下内容:在Python 2中,作为列表理解的副作用,可以执行本地赋值。
但是,在您的示例中不可能使用这两种方法,因为变量
flag
位于外部作用域中,而不是lambda
的作用域中。这与lambda
无关,这是Python 2中的一般行为。Python 3允许您在def
s内部使用nonlocal
关键字来解决这个问题,但是nonlocal
不能在lambda
s内部使用有一个解决办法(见下文),但当我们讨论这个话题时。。。
在某些情况下,您可以使用它来执行
lambda
中的所有操作:请不要
…回到原来的示例:虽然不能对外部作用域中的
flag
变量执行赋值,但可以使用函数修改先前赋值。例如,} 设置其
flag
可以是我们使用^{.value
的对象:如果我们想符合上述主题,可以使用列表理解而不是
setattr
:但实际上,在严肃的代码中,如果要执行外部赋值,则应该始终使用正则函数定义,而不是
lambda
。当您可以移除所有空值时,不需要使用lambda,如果输入大小发生变化,则可以放回lambda:
相关问题 更多 >
编程相关推荐