我在写这个循环时遇到了问题;它似乎在第二个序列后停止。
我想将互补DNA序列返回到给定的DNA序列。
E.g。 ('AGATTC') - > ('TCTAAG'),其中A:T和C:G
def get_complementary_sequence(dna):
"""(str) -> str
> Return the DNA sequence that is complementary to the given DNA sequence
>>> get_complementary_sequence('AT')
('TA')
>>> get_complementary_sequence('AGATTC')
('TCTAAG')
"""
x = 0
complementary_sequence = ''
for char in dna:
complementary_sequence = (get_complement(dna))
return complementary_sequence + (dna[x:x+1])
有人能说出为什么循环不会继续吗?
答案 0 :(得分:3)
以下是我将如何做的示例 - 实际上只有两行代码:
from string import maketrans
DNA="CCAGCTTATCGGGGTACCTAAATACAGAGATAT" #example DNA fragment
def complement(sequence):
reverse = sequence[::-1]
return reverse.translate(maketrans('ATCG','TAGC'))
print complement(DNA)
答案 1 :(得分:2)
您在所有get_complement
而不是每个dna
上致电char
。这将简单地使用相同的参数len(dna)次调用come函数。如果您从未使用它们,则没有理由循环遍历char
。如果get_complement()
可以使用char,我会建议:
for char in dna:
complementary_sequence += get_complement(char)
get_complement的实现将采用单个字符并返回其补码。
此外,您还要返回complementary_sequence + (dna[x:x+1])
。如果您希望函数符合您已记录的行为,+ (dna[x:x+1])
将从dna
字符串的开头添加一个额外(错误)字符。您需要返回的只是complementary_sequence
!感谢@Kevin注意到。
你在做什么:
>>> dna = "1234"
>>> for char in dna:
... print dna
...
1234
1234
1234
1234
我认为更接近你想要做的事情:
>>> for char in dna:
... print char
...
1
2
3
4
全部放在一起:
# you could also use a list comprehension, with a join() call, but
# this is closer to your original implementation.
def get_complementary_sequence(seq):
complement = ''
for char in seq:
complement += get_complement(char)
return complement
def get_complement(base):
complements = {'A':'T', 'T':'A', 'C':'G', 'G':'C'}
return complements[base]
>>> get_complementary_sequence('AT')
'TA'
>>> get_complementary_sequence('AGATTC')
'TCTAAG'
答案 2 :(得分:2)
你在打电话:
complementary_sequence = (get_complement(dna))
... n 次 n 是字符串的长度。这使您无法get_complement(dna)
中complementary_sequence
的返回值。大概只有一个字母。
然后返回此一个字母(complementary_sequence
),后跟子字符串dna[0:1]
(即 dna
中的第一个字母),因为{{1} } 总是 x
。
这就是你总是得到两个字符的原因。
假设您有以下功能:
0
...您只需使用str.join()
和list comprehension:
def get_complement(d):
return {'T': 'A', 'A': 'T', 'C': 'G', 'G': 'C'}.get(d, d)