在biopython中使用if / else列出推导

时间:2014-07-07 04:37:10

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

我希望这能在一个列表中理解:

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"在RCList rec中,如果不是rec.id +" _RC"在RCList中)

或同样如下:

  

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

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

  

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

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

1 个答案:

答案 0 :(得分:2)

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

Listcomps和genexps具有以下格式:

expression for x in iterable if condition

将评估if condition部分,如果结果为true,将评估expression部分,并且(对于listcomp)该值将显示在新列表中;或者(对于genexp),该值将出现在所产生的值中。但是这里没有else的规定。

您可以使用Python中的三元if完全按照您的要求执行操作。您可以使用以下格式的表达式:

true_expression if condition else false_value

condition将被评估。如果结果为true,则将评估true_expression并返回结果;如果condition的结果为false,则将评估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?