【问题标题】:list comprehensions with if/else in biopython在 biopython 中使用 if/else 列出理解
【发布时间】:2014-08-27 11:51:50
【问题描述】:

我希望在单个列表理解中执行此操作:

for rec in SeqIO.parse(infile2, "fastq"):
    if rec.id+"_RC" in RCList:
        rec.reverse_complement(id=rec.id,description="")
    else:
        rec

这行得通:

good_reads = ( rec.reverse_complement(id=rec.id,description="") for rec in SeqIO.parse(infile2, "fastq") if rec.id+"_RC" in RCList )

如果我将 else 放入这一行,则会出现一般无效的语法错误:

(1) 读取 = ( rec.reverse_complement(id=rec.id,description="") for rec in SeqIO.parse(infile2, "fastq") if rec.id+"_RC" in RCList rec if not rec .id+"_RC" in RCList)

或同样适用:

(2) 读取 = ( rec.reverse_complement(id=rec.id,description="") for rec in SeqIO.parse(infile2, "fastq") if rec.id+"_RC" in RCList else (rec) )

最后,我使用 SeqIO 将其写入文件

SeqIO.write(good_reads,infile2+".RC.fastq", "fastq")

上述(1)和(2)有什么问题?

【问题讨论】:

标签: python list if-statement list-comprehension biopython


【解决方案1】:

列表推导和生成器表达式可能有点令人困惑,因为它们使用关键字 if,但它与 Python 中通常的 if 不同。

Listcomps 和 genexps 的格式如下:

expression for x in iterable if condition

if condition 部分将被评估,如果结果为真,expression 部分将被评估,并且(对于 listcomp)该值将出现在新列表中;或(对于 genexp)该值将出现在产生的值中。但是这里没有提供else

您可以使用 Python 中的三元 if 来做您想做的事。您可以使用这种格式的表达式:

true_expression if condition else false_value

condition 将被评估。如果结果为真,则true_expression 将被评估并返回结果;如果condition 的结果为假,则将评估false_value 并返回结果。这是一种表达方式。

有些人认为将三元 if 放入括号可以提高可读性:

(true_expression if condition else false_value)

您可以将上述三元表达式用作 listcomp 或 genexp 的 expression 部分。

所以,你可以这样使用它:

good_reads = ( rec.reverse_complement(id=rec.id,description="") if rec.id+"_RC" in RCList else rec for rec in SeqIO.parse(infile2, "fastq")  )

另见:

Is it possible to use 'else' in a python list comprehension?

【讨论】:

  • 可以发誓我试过了!非常感谢您的解释,非常简洁。
  • 如果使用 'elif' 等效项而不是最终的 else 会怎样?如果我在“else”之后附加一个“if”语句,它只会产生 else 结果,而不是第一个 if 条件。
  • 表达式中没有elif。但!你可以做你想做的!请注意,三元组内部实际上存在三个表达式:true_expressionconditionfalse_expression。其中任何一个本身都可以是三元表达式。但它很快就会变得疯狂。你可以创建一个辅助函数并在其中放入任何你喜欢的if 语句,然后调用辅助函数:good_reads = ( helper_function(rec) for rec in SeqIO.parse(infile2, "fastq") )
  • 啊,当然。非常感谢您的帮助,该程序现在又好又快。
猜你喜欢
  • 1970-01-01
  • 2021-10-13
  • 2018-04-27
  • 2023-03-14
  • 2011-05-23
  • 1970-01-01
  • 2019-11-26
  • 2018-03-18
  • 1970-01-01
相关资源
最近更新 更多