Python生成器表达式if-else

Nup*_*pur 4 python generator-expression

我正在使用Python来解析一个大文件.我想做的是

If condition =True
   append to list A
else 
   append to list B
Run Code Online (Sandbox Code Playgroud)

我想为此使用生成器表达式 - 以节省内存.我正在加入实际的代码.

def is_low_qual(read):
    lowqual_bp=(bq for bq in phred_quals(read) if bq < qual_threshold)  
    if iter_length(lowqual_bp) >  num_allowed:
        return True
    else:
        return False  

lowqual=(read for read in SeqIO.parse(r_file,"fastq") if is_low_qual(read)==True)
highqual=(read for read in SeqIO.parse(r_file,"fastq") if is_low_qual(read)==False)


SeqIO.write(highqual,flt_out_handle,"fastq")
SeqIO.write(lowqual,junk_out_handle,"fastq")

def iter_length(the_gen):
    return sum(1 for i in the_gen)
Run Code Online (Sandbox Code Playgroud)

nne*_*neo 6

您可以使用itertools.tee会同itertools.ifilteritertools.ifilterfalse:

import itertools
def is_condition_true(x):
    ...

gen1, gen2 = itertools.tee(sequences)
low = itertools.ifilter(is_condition_true, gen1)
high = itertools.ifilterfalse(is_condition_true, gen2)
Run Code Online (Sandbox Code Playgroud)

tee即使序列本身是生成器,使用也可确保函数正常工作.

但是请注意,如果并且以不同的速率消耗(例如,如果在使用之前已经耗尽),那么tee它本身可以使用相当大的内存(直到大小列表).len(sequences)lowhighlowhigh