我希望这能在一个列表中理解:
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)中有什么问题?
答案 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?