列表理解中的"如果...或......"语句?

Gre*_*n23 2 python list-comprehension python-3.x

在Python 3.4.2中,是否有一种方法可以在列表推导中使用"if ...或..."语句?

例:

filtered_list = [x for x in other_list
                 if not '    ' in x or '    ' in other_list[int(other_list.index(x) -1)]]
                                                 #^item just before "x" in "other_list"
Run Code Online (Sandbox Code Playgroud)

我知道这个命令不起作用.我知道这个也不是:

filtered_list = [x for x in other_list
                 if not ('    ' in x) or ('    ' in other_list[int(other_list.index(x) -1)])]
                                                    #^item just before "x" in "other_list"
Run Code Online (Sandbox Code Playgroud)

有没有办法做到这一点?一个"for"循环会更容易阅读,但我试图推动我对列表理解的理解.提前致谢.

(奇怪的是,我在stackoverflow上找不到像这样的先前问题.)

Ale*_*lli 9

您的代码确实完成了您要告诉它的操作(在简单的情况下):

>>> other_list = ['foo', 'bar    ', 'baz    ']
>>> filtered_list = [x for x in other_list
...                  if not '    ' in x or '    ' in other_list[int(other_list.index(x) -1)]]
>>> print filtered_list
['foo', 'baz    ']
Run Code Online (Sandbox Code Playgroud)

即,它选择,要么不包含四个空格,或者按照一个项目的所有项目包含四个空格.

它在很多方面都是非常奇怪的代码 - 例如,为什么使用.index哪个会选择相同的第一个项目x,以防重复; 并且,如果第一个项目被认为是"跟随"最后一个项目,正如此代码所说的那样?但是,如果没有用英语清楚地解释你的代码应该完成什么,只需对代码进行"逆向工程",它就像在简单的情况下完全一样(第一项不包含四个空格,没有重复) ),虽然非常非常低效(O(N平方),其中使O(N)变得非常简单enumerate).

所以请提供一个清晰,详尽的解释,说明你在这里做了什么,我很乐意编辑这个答案,告诉你如何做你真正的意思,而不是你(显然是错误的)编码.但是,我无法读懂你的想法,所以......(顺便说一句,这确实需要"回答",因为格式化上面的代码对于它的可读性至关重要,所以它不能只是"只是一个评论").

补充:"正好在当前的项目之前获取项目"的正常方法other_list当然不会使用.index(O(N)这样可以使整个列表理解O(N squared)!)而是enumerate.什么是"之前的项目",一个需要解释,但正常的阅读是"没有这样的事情".

因此,假设您有两个函数curp(谓词限定当前项目,如果它是真实的)和prevp(谓词限定当前项目,如果有一项,如果有的话).然后,从列表中选择项目的常规方法xs显然是:

[x for i, x in enumerate(xs) if curp(x) or i>0 and prevp(xs[i-1])]
Run Code Online (Sandbox Code Playgroud)

当然,无论谓词是否被优雅地封装到函数中,如上所述,还是更粗略地以线性表达,它的工作原理完全相同.所以,如果,例如:

def curp(x): return 'AB' not in x
def prevp(xp): return 'CD' in xp
Run Code Online (Sandbox Code Playgroud)

然后下面的listcomp等同于前一个,只是不太可读:

[x for i, x in enumerate(xs) if 'AB' not in X or i>0 and 'CD' in xs[i-1]]
Run Code Online (Sandbox Code Playgroud)

括号在这里将是相当多余的,并且not 'AB' in X更加优雅,可读和明确的表达方式'AB' not in X- 但是,可以随意忽略这些风格的意见,它们只来自15年的Python经验,毕竟:-)


Mat*_*DMo 5

您可以使用多个ands/ ors,但只能使用一个if. 例如,以下内容:

In [7]: a = [1,2,3,4,5,6,7,8,9,10]

In [8]: b = [x for x in a if x % 2 == 0 or x % 3 == 0]

In [9]: b
Out[9]: [2, 3, 4, 6, 8, 9, 10]
Run Code Online (Sandbox Code Playgroud)

工作得很好。