如何将表达式分解为for循环

时间:2014-01-31 10:28:06

标签: python for-loop syntax

我不是python专家,我遇到了这段代码实际上有效并产生了正确的答案,但我不确定我是否理解第二行会发生什么:

for i in range(len(motifs[0])):
            best = ''.join([motifs[j][i] for j in range(len(motifs))])
            profile.append([(best.count(base)+1)/float(len(best)) for base in 'ACGT']) 

我试图用以下内容替换它:

for i in range(len(motifs[0])):
    for j in range(len(motifs)):
        best =[motifs[j][i]]
    profile.append([(best.count(base)+1)/float(len(best)) for base in 'ACGT']) 

并试图像这样分解最后一行:

for i in range(len(motifs[0])):
    for j in range(len(motifs)):
        best =[motifs[j][i]]
    for base in 'ACGT':
        profile.append(best.count(base)+1)/float(len(best)

我尝试了一些更多的变化,但没有它们起作用。 我的问题是:这些表达式(第一个代码的第二行和第三行)是什么意思,你将如何将其分解为几行?

谢谢:)

3 个答案:

答案 0 :(得分:3)

''.join([motifs[j][i] for j in range(len(motifs))])

是惯用的

''.join(m[i] for m in motifs)

所以它按顺序连接所有主题的i条目。类似地,

[(best.count(bseq)+1)/float(len(seq)) for base in 'ACGT']

(best.count(bseq)+1)/float(len(seq))建立ACGT值列表;由于base变量实际上没有发生,它是一个包含相同值四次的列表,可以简化为

[(best.count(bseq)+1) / float(len(seq))] * 4

答案 1 :(得分:1)

最近,我没有能够测试它

for i, _ in enumerate(motifs[0]):
    seq = ""
    for m in motifs:
        seq += m[i]

    tmp = []
    for base in "ACGT":
        tmp.append(best.count(bseq) + 1 / float(len(seq)))
    profile.append(tmp)

答案 2 :(得分:1)

for i in range(len(motifs[0])):
            seq = ''.join([motifs[j][i] for j in range(len(motifs))])
            profile.append([(best.count(bseq)+1)/float(len(seq)) for base in 'ACGT']) 

相当于:

for i in range(len(motifs[0])):
    seq = '' 
    for j in range(len(motifs)):
            seq += motifs[j][i] 
    profile.append([(best.count(bseq)+1)/float(len(seq)) for base in 'ACGT']) 

可以通过无数种方式进行改进。

例如:

seqs = [ ''.join(motif) for motif in motifs ]
bc   = best.count(bseq)+1
profilte.extend([ map(lambda x: bc / float(len(x)), 
    seq) for base in 'ACGT' ] for seq in seqs)

正确性,由于缺乏输入/输出条件,我无法测试。