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

谁能发现为什么循环不继续?

4

3 回答 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)
于 2014-09-22T21:42:49.637 回答
2

怎么了?

你在打电话:

complementary_sequence = (get_complement(dna))

... n次,其中n是字符串的长度。这给你留下了get_complement(dna)in的任何返回值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])
于 2013-09-12T17:51:06.447 回答
2

您调用get_complementall ofdna而不是 each char。这将简单地使用相同的参数 len(dna) 次调用 come 函数。char如果您从不使用它们,则没有理由遍历s。如果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'
于 2013-09-12T17:36:27.503 回答