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

Python 如何将表达式分解为for循环,python,for-loop,syntax,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

我不是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)
我尝试了更多的变化,但没有一个奏效。 我的问题是:这些表达式(第一个代码的第二行和第三行)是什么意思?您如何将其分解为几行

谢谢:)

是用惯用的语言写的

''.join(m[i] for m in motifs)
因此,它将所有主题的第i个条目按顺序连接起来。同样地

[(best.count(bseq)+1)/float(len(seq)) for base in 'ACGT']
为of
ACGT
建立一个
(最佳计数(bseq)+1)/float(len(seq))值的列表;由于
base
变量实际上没有出现,因此它是一个包含相同值四次的列表,可以简化为

[(best.count(bseq)+1) / float(len(seq))] * 4
是用惯用的语言写的

''.join(m[i] for m in motifs)
因此,它将所有主题的第i个条目按顺序连接起来。同样地

[(best.count(bseq)+1)/float(len(seq)) for base in 'ACGT']
为of
ACGT
建立一个
(最佳计数(bseq)+1)/float(len(seq))值的列表;由于
base
变量实际上没有出现,因此它是一个包含相同值四次的列表,可以简化为

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

在没有测试的情况下,我得到了最接近的结果

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)

在没有测试的情况下,我得到了最接近的结果

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)
相当于:

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)
其正确性,由于缺乏输入/输出条件,我无法测试

相当于:

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)


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

带有for循环的
[…]
语法称为a。谢谢!那真的很有帮助!带有for循环的
[…]
语法称为a。谢谢!那真的很有帮助!这在
范围(len(某物))
上循环几乎总是错误的。我向所有还没有这样做的人推荐观看。“因此,它将所有图案的第I个条目按顺序连接起来。”-从某种意义上说,这就像创建一个数组并将其转置?还是我误解了?这个。在
范围(len(某物))
上循环几乎总是错误的。我向所有还没有这样做的人推荐观看。“因此,它将所有图案的第I个条目按顺序连接起来。”-从某种意义上说,这就像创建一个数组并将其转置?还是我误解了?修正了第二个循环是的,这就是为什么列表理解是一件很好的事情,事实上,这并不是我所需要的。我的seq现在有不同的长度,我希望它总是一个固定的长度(len(motif))固定第二个循环,这就是为什么列表理解是一件很好的事情,实际上这并不是我所需要的。我的seq现在有不同的长度,我希望它总是一个固定的长度(len(motif))参见其他答案中的一些示例,通常不需要范围,而是使用enumerate,它提供索引和该索引处的项。如果您不需要索引,那么只需对Motif中的item使用
即可
构造以仅获取项目…当我尝试实现最后一段代码(改进的代码)时,我以后无法将概要文件的值用作Int,因为它是一个映射。(我也不能投)。有什么想法吗?请参阅其他答案中的一些示例,您通常不需要范围,而是使用enumerate,它为您提供索引和该索引处的项。如果您不需要索引,那么只需对Motif中的item使用
即可
构造以仅获取项目…当我尝试实现最后一段代码(改进的代码)时,我以后无法将概要文件的值用作Int,因为它是一个映射。(我也不能投)。有什么想法吗?