互补DNA序列

时间:2013-09-12 17:25:15

标签: for-loop python-3.x sequence

我在写这个循环时遇到了问题;它似乎在第二个序列后停止。

我想将互补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])

有人能说出为什么循环不会继续吗?

3 个答案:

答案 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)