互补DNA序列

3

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

我想返回给定DNA序列的互补DNA序列。

例如('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
get_complement做什么? - Kevin
1
get_complement函数生成互补碱基对,例如:'A':'T'。 - user2773611
3个回答

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)

2

您需要对所有的dna调用get_complement而不是每个char。这将仅使用相同的参数多次调用相同的函数len(dna)次。如果您从未使用它们,则无需循环遍历chars。如果get_complement()可以接受一个字符,我建议:

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'

@user2773611 这确实会打印出补码字符串。 - vroomfondel
刚刚尝试了上面的代码,它只输出了:get_complementary_sequence('AGATTC') 返回 'T'。 - user2773611
@user2773611,我认为你误解了我的解释。我已经编辑过了,给你一个完整的、可工作的版本。也许我对get_complement应该做什么有误解。 - vroomfondel
你的 get_complement 函数很好用,只是当我运行 get_complementary_sequence('AGATTC') 时,返回了 ('T')。 - user2773611
@user2773611 你使用的是我实现的完全一样的代码吗?它是有效的,正如你可以从测试用例中看到的那样。你确定循环缩进正确吗?如果不正确,它可能会运行一次,你会看到这种行为。 - vroomfondel
非常感谢你的帮助,我在这方面错了。现在一切都正常了,谢谢! - user2773611

2

出了什么问题?

你正在调用:

complementary_sequence = (get_complement(dna))

...n次,其中n是字符串的长度。这样你就得到了get_complement(dna)complementary_sequence中的返回值,大概只有一个字符。

接下来,你需要返回这个字符(complementary_sequence)后面跟着dna[0:1]子串(也就是dna中的第一个字母),因为x始终是0

这就是为什么你总是会得到两个字符的返回值。

如何修复它?

假设你有一个像下面这样的函数:

def get_complement(d):
    return {'T': 'A', 'A': 'T', 'C': 'G', 'G': 'C'}.get(d, d)

如果您想修复函数,只需使用str.join()列表推导式

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')

    """

    return ''.join([get_complement(c) for c in dna])

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接