python - 列表理解中的 "If...or..."语句?

标签 python python-3.x list-comprehension

在 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/

相关文章:

python - BeautifulSoup Steam 市场网页抓取错误

Python XLWT 调整列宽

python - 列表理解从元组列表构建嵌套字典

python - 是否可以在 scikit learn 中使用复数作为目标标签?

python - 用不同的随机数替换二维数组中的值

Python绘制时间列表

javascript - 这个数组理解正确吗?

python - python3.x中根据另一个列表中的子字符串列表删除列表中的项目

python-3.x - 如何在 ipython 中运行 Python 脚本?

linux - 如果 python 脚本因错误而停止,请重新启动树莓派