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上找不到像这样的先前问题.)
您的代码确实完成了您要告诉它的操作(在简单的情况下):
>>> 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经验,毕竟:-)
您可以使用多个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)
工作得很好。
| 归档时间: |
|
| 查看次数: |
9211 次 |
| 最近记录: |