在python中使用包含1个以上变量的for循环

2024-09-28 19:06:05 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在写一个程序,我想在我的for循环中使用3个变量,并且每个变量都应该从不同的开始索引运行。这是我的代码片段。我有一个名为codons的表,其中每三个字母都有一些值,例如'atg':'F''ggg':'Q''ttg':'E'等等

seq='atgggggggcccccc'
seqlen= len(seq)
aaseq1=[]
aaseq2=[]
aaseq3=[]
for i in range(0,seqlen,3):
     codon1 = seq[i:i+3]
     aa1 = codons[codon1]
     aaseq1.append(aa1)  
print ''.join(aaseq1)  

在这段代码中,我从位置0运行变量i,但我想再使用2个变量(j和{}),分别从1和2运行,并将结果追加到aaseq2aaseq3列表中。在

^{pr2}$

Tags: 代码程序for字母seqatggggcodons
3条回答

您似乎在寻找内置的zip函数,它允许锁步迭代。结合元组解包,其工作原理如下:

>>> for i,j in zip(range(3), range(10,13)):
...   print(i,j)
... 
0 10
1 11
2 12

zip的参数是您通常可以在for循环的该部分中使用的任何参数,并且可以有任意数量的参数(只要您分配给相同数量的变量,或者只分配给一个变量,该变量将在每次迭代中成为元组)。在

有很多方法可以做到这一点,最好的方法取决于你的seq在现实生活中有多大。其他答案给出了一些很好的方法来使用Python特性来避免显式地构建列表。在

不管是三个连续的一个,{cd2}都是连续的。在

对于你给我的例子来说,这是非常容易阅读的,但大体上保留了你开始时使用的数据结构,我假设你很熟悉。我为codons添加了一个截断的dict,这样代码就可以运行了。在

codons = {'atg':'Methionine','tgg':'Tryptophan','ggg':'Glycine',
          'ggc':'Glycine','gcc':'Alanine','ccc':'Proline'}

seq='atgggggggcccccc'
seqlen= len(seq)
aaseq=[[],[],[]]

for i in range(seqlen-2):
     codon = seq[i:i+3]    
     aa = codons[codon]
     aaseq[i%3].append(aa)  

print 'aaseq1 ='
print ''.join(aaseq[0])  
print 'aaseq2 ='
print ''.join(aaseq[1])  
print 'aaseq3 ='
print ''.join(aaseq[2])  

这将产生以下输出:

^{pr2}$

如果你想要一个更简洁的表格-试试这个:

#Make every codon by zipping the sequence offset by one each time
codon_sequence = [''.join(z) for z in zip(seq,seq[1:],seq[2:])]
#Print every 3rd codon - starting at zero...
print 'aaseq1 = ',''.join([codons[c] for c in codon_sequence[::3]])
#...then starting at 1...
print 'aaseq2 = ',''.join([codons[c] for c in codon_sequence[1::3]])
#...you get the picture...
print 'aaseq3 = ',''.join([codons[c] for c in codon_sequence[2::3]])

当然,如果需要进一步处理,可以将它们分配给变量,而不是最后一步打印序列。在

(我通常)尽量不要在Python中使用循环。虽然(正如@PM-2ring在一篇评论中指出的那样)列表表达式并不一定比显式循环快,但有些人发现,通过让python尽可能多地处理数据迭代的细节,它们可以更快地编写、理解和调试。在

下面是您的程序的几个版本,最终“pythonified”为四行,只是为了看看它去了哪里。在

通常有一些方法可以让Python为您做一些事情,使用索引和列表表达式。这些都可以是简洁而强大的东西,许多python函数只做您希望它们做的事情。例如,zip只会在末尾丢弃悬空的碱基对,而不会抱怨。在

打印语句只是为了看看发生了什么,当然稍后删除它们。在

seq='atgggggggcccccc'

s1 = seq[0::3]  # you can drop the zero, it's just for readability
s2 = seq[1::3]
s3 = seq[2::3]

c1 = zip( s1,    s2,     s3     )
c2 = zip( s2,    s3,     s1[1:] )  # frame shift of 1
c3 = zip( s3,    s1[1:], s2[1:] )  # frame shift of 2

print c1
print c2
print c3

co1 = [bp1+bp2+bp3 for (bp1, bp2, bp3) in c1]
co2 = [bp1+bp2+bp3 for (bp1, bp2, bp3) in c2]
co3 = [bp1+bp2+bp3 for (bp1, bp2, bp3) in c3]

print co1
print co2
print co3

aaseq1 = [codons(thing) for thing in c1]
aaseq2 = [codons(thing) for thing in c2]
aaseq3 = [codons(thing) for thing in c3]

…也可以这样写:

^{pr2}$

那只是为了宣传更多的python。对于初学者来说,它的可读性可能较低。在

这是一个更进一步的pythonification(只是为了看看它的去向……):

S = [seq[i::3] for i in range(3)]   # three reading frames

C = zip(S[0], S[1], S[2]), zip(S[1], S[2], S[0][1:]), zip(S[2], S[0][1:], S[1][1:]) # group

CO = [[''.join(tr) for tr in c] for c in C]    # tuples to triplet strings

AASEQs = [[codons(trip) for trip in co] for co in CO]  # look up Amino Acids

最后,如果你想把三个AA序列变成三个长字符串:

final_AASEQs = [''.join(AASEQ) for AASEQ in AASEQs]

为了好玩,下面是字典codons可能的样子(从Wikipedia开始,注意A,T,G,C基的大写。所以在问题seq = 'ATGGGGGGGCCCCCC'

codons = {'CTT': 'Leu', 'ATG': 'Met', 'AAG': 'Lys', 'AAA': 'Lys', 'ATC': 'Ile',
          'AAC': 'Asn', 'ATA': 'Ile', 'AGG': 'Arg', 'CCT': 'Pro', 'ACT': 'Thr',
          'AGC': 'Ser', 'ACA': 'Thr', 'AGA': 'Arg', 'CAT': 'His', 'AAT': 'Asn',
          'ATT': 'Ile', 'CTG': 'Leu', 'CTA': 'Leu', 'CTC': 'Leu', 'CAC': 'His',
          'ACG': 'Thr', 'CAA': 'Gln', 'AGT': 'Ser', 'CAG': 'Gln', 'CCG': 'Pro',
          'CCC': 'Pro', 'TAT': 'Tyr', 'GGT': 'Gly', 'TGT': 'Cys', 'CGA': 'Arg',
          'CCA': 'Pro', 'CGC': 'Arg', 'GAT': 'Asp', 'CGG': 'Arg', 'TTT': 'Phe',
          'TGC': 'Cys', 'GGG': 'Gly', 'TAG': 'STOP', 'GGA': 'Gly', 'TGG': 'Trp',
          'GGC': 'Gly', 'TAC': 'Tyr', 'GAG': 'Glu', 'TCG': 'Ser', 'TTA': 'Leu',
          'GAC': 'Asp', 'CGT': 'Arg', 'GAA': 'Glu', 'TCA': 'Ser', 'GCA': 'Ala',
          'GTA': 'Val', 'GCC': 'Ala', 'GTC': 'Val', 'GCG': 'Ala', 'GTG': 'Val',
          'TTC': 'Phe', 'GTT': 'Val', 'GCT': 'Ala', 'ACC': 'Thr', 'TGA': 'STOP',
          'TTG': 'Leu', 'TCC': 'Ser', 'TAA': 'STOP', 'TCT': 'Ser'}  # ATG also START

相关问题 更多 >