在 Python 3.4.2 中,有没有办法在列表推导中包含“if ... or ...”语句?
示例:
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"
我知道这个命令不起作用。我知道这个也没有:
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"
有没有办法做到这一点? “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 ']
即,它会选择所有不包含四个空格的项目,或者跟在确实包含四个空格的项目之后的所有项目。
它在很多方面都是非常奇怪的代码——例如,为什么使用 .index
它将选择 first 等于 x
的项目重复的情况;并且,是否应该像该代码所说的那样将第一项视为“跟随”最后一项?但是,如果没有用英语清楚地解释您的代码应该完成什么,只是对编写的代码进行“逆向工程”,它在简单情况下似乎确实按照它所说的去做(第一项不包含四个空格,没有重复项),虽然非常非常非常效率低下(O(N 平方),其中使用 enumerate
使其成为 O(N) 非常简单)。
因此,请对您认为自己在这里做什么什么提供清晰、详尽的解释,我很乐意编辑此答案以向您展示如何按照您的实际意思去做,而不是做什么您(显然错误地)编码。但是,我无法读懂你的想法,所以......(顺便说一句,这确实需要是“一个答案”,因为格式化上面的代码对其可读性至关重要,所以它不能“只是一个评论”)。
添加:“获取 other_list
中当前项目之前的项目”的正常方法当然不使用 .index
(这是 O(N)
所以整个列表理解 O(N squared)
!) 而不是 enumerate
。 第一个的“前一项”是什么需要解释,但正常阅读是“没有这样的东西”。
所以假设你有两个函数 curp
(谓词限定当前项,如果它为真)和 prevp
(谓词限定当前项,如果 < strong>上一个 项目如果有的话)。那么,从列表 xs
中选择项目的正常方法显然是:
[x for i, x in enumerate(xs) if curp(x) or i>0 and prevp(xs[i-1])]
当然,无论谓词是优雅地封装到函数中(如上),还是更粗略地内联表达,其工作方式都完全相同。所以,如果,例如:
def curp(x): return 'AB' not in x
def prevp(xp): return 'CD' in xp
那么下面的 listcomp 等同于前一个,只是可读性差一点:
[x for i, x in enumerate(xs) if 'AB' not in X or i>0 and 'CD' in xs[i-1]]
括号在这里会显得多余,not 'AB' in X
是表达 'AB' not in X
的更不优雅、可读性和明确的方式 - - 但是,请随意忽略这些风格意见,毕竟它们仅来自 15 年的 Python 经验:-)
关于python - 列表理解中的 "If...or..."语句?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27652251/