Python 列出对新元素的理解和条件

Python 列出对新元素的理解和条件,python,list,list-comprehension,Python,List,List Comprehension,我将在这里窃取问题的形式: 我有一个简单的清单 >>> a = [0, 1, 2] 我想使用列表理解从中创建一个新列表 >>> b = [afunction(x) for x in a] >>> b [12458, None, 34745] 非常简单,但是如果我只想在非None元素上操作呢?我可以这样做: >>> b = [y for y in [afunction(x) for x in a] if y != None

我将在这里窃取问题的形式:

我有一个简单的清单

>>> a = [0, 1, 2]
我想使用列表理解从中创建一个新列表

>>> b = [afunction(x) for x in a]
>>> b
[12458, None, 34745]
非常简单,但是如果我只想在非None元素上操作呢?我可以这样做:

>>> b = [y for y in [afunction(x) for x in a] if y != None]

我更希望能够做到这一点与单一列表的理解,在一次运行。我相信,这会再次迭代列表以过滤掉非,没有人真的喜欢这样做。

您不需要构建列表,然后再次迭代,您可以使用函数应用程序的迭代器,使用映射:

或括号类型中的生成器表达式注释更改:

[y for y in (afunction(x) for x in a) if y is not None]
          # ^ here                  ^ and here

还要注意的是,这些测试是根据身份而不是相等性来进行的。

除非在列表comp的一次运行中有两次对函数的调用,否则您不能这样做,即[a中的函数x对于x,如果函数x不是None]。或者迭代映射[y代表mapafunction中的y,如果y不是None]或生成器表达式,这至少避免了构建listMapping也会在列表上迭代两次,对吗?不,因为它不构建列表,然后再次迭代,它一次只消耗函数的一个元素。@spectras它的复杂性是什么?您可以使用生成器表达式表单,替换映射。。。对于注释中的x的函数x,括号不是方括号[],但我不认为这会提高可读性。@spectras-围绕需要不熟悉手边语言的开发人员阅读和理解的代码进行规划可能不是最好的主意。在我之前的评论中,我说过map方法可能会在列表上重复两次。我是在从Python的文档中寻找地图的描述之后说的。显然这就像我在Python2.x上说的那样,现在就像你在Python3.x上说的那样。谢谢。@ThoAppelsin是的,这是3.0版的一个变化,2.x版即将退役,我假设3.x版,除非OP另有说明!
[y for y in (afunction(x) for x in a) if y is not None]
          # ^ here                  ^ and here