我不是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)
我尝试了一些更多的变化,但没有它们起作用。 我的问题是:这些表达式(第一个代码的第二行和第三行)是什么意思,你将如何将其分解为几行?
谢谢:)
答案 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)
正确性,由于缺乏输入/输出条件,我无法测试。