在Python列表推导中缓存值

Kai*_*Kai 5 python list-comprehension

我正在使用以下列表理解:

resources = [obj.get("file") for obj in iterator if obj.get("file") != None]
Run Code Online (Sandbox Code Playgroud)

有没有办法"缓存" obj.get("file")在if语句中检查它的值,以便它get在生成返回列表时不必再次调用obj?

Jon*_*ric 9

resources = filter(None, (obj.get("file") for obj in iterator))
Run Code Online (Sandbox Code Playgroud)

有关如何提供自己的评估功能,请参阅过滤器文档.传递None函数(如上所述)过滤掉所有不正确的值.

如果obj.get()返回一个具有奇怪__nonzero__方法的对象,那么您需要传递lambda obj: obj != None以获得与原始代码完全相同的结果.


nik*_*kow 6

如果你想继续使用list/iterator comprehensions而不是使用filter你可以简单地使用:

resources = [file_obj
             for file_obj in (obj.get("file") for obj in iterator)
             if file_obj is not None]
Run Code Online (Sandbox Code Playgroud)