-3

我写了一个简单的程序来将 DNA 翻译成 RNA。基本上,您输入一个字符串,它将字符串分成字符并将它们发送到一个列表,移动字母并从结果列表中返回一个字符串。该程序正确地将 a 转换为 u,并将 to 转换为 a,但不会将 g 转换为 c,将 c 转换为 g。

这是程序:

def trad(x):

    h=[]
    for letter in x:
        h.append(letter)
    for letter in h:
        if letter=="a":
            h[h.index(letter)]="u"
            continue
        if letter=="t":
            h[h.index(letter)]="a"
            continue
        if letter=="g":
            h[h.index(letter)]="c"
            continue
        if letter=="c":
            h[h.index(letter)]="g"
            continue
    ret=""
    for letter in h:
        ret+=letter
    return ret

while True:
    stry=raw_input("String?")
    print trad(stry)

现在,只需通过不迭代元素而是在位置上迭代来改变程序,它就可以按预期工作。这是生成的代码:

def trad(x):
    h=[]
    for letter in x:
        h.append(letter)
    for letter in xrange (0, len(h)):
        if h[letter]=="a":
            h[letter]="u"
            continue
        if h[letter]=="t":
            h[letter]="a"
            continue
        if h[letter]=="g":
            h[letter]="c"
            continue
        if h[letter]=="c":
            h[letter]="g"
            continue
    ret=""
    for letter in h:
        ret+=letter
    return ret

while True:
    stry=raw_input("String?")
    print trad(stry)

为什么会出现这种奇怪的行为,我该如何解决?

4

2 回答 2

7

你正在以一种比必要的方式更难的方式来解决这个问题,这可以很容易地使用str.translate()- 一种str将一个字符的实例转换为另一个字符的实例的方法,这正是你想要的:

import string
replacements = string.maketrans("atgc", "uacg")
while True:
    stry=raw_input("String?")
    print stry.translate(replacements)

这是 2.x 的答案,在 3.x 中,请str.maketrans()改用。

于 2013-02-23T18:40:49.313 回答
0

我不确定您遇到什么类型的问题,但这里有一个简单的方法,使用字典。

def trad(coding_strand):
    mRNA_parts = {'a': 'u', 't': 'a', 'g': 'c', 'c': 'g'}
    mRNA = ''
    for nucleotide in coding_strand: # this makes it lowercase
        mRNA += mRNA_parts[nucleotide.lower()]
    return mRNA.upper() # returns it as uppercase

我将它以大写形式返回,因为通常 DNA/RNA 中的核苷酸都是大写的。

我还修改了您的方法...最好自己遍历索引;那么你不必这样做l.index(elem)

def trad(coding_strand):
    mRNA = []
    for index in range(len(coding_strand)):
       nucleotide = coding_strand[index].upper()
       if nucleotide == 'A':
           mRNA.append('U')
       elif nucleotide == 'T':
           mRNA.append('A')
       elif nucleotide == 'C':
           mRNA.append('G')
       elif nucleotide == 'G':
           mRNA.append('C')
    ret = ''
    for letter in mRNA:
        ret += mRNA
    print ret

我不建议使用字符串并添加到它或使用列表;列表理解更有效。

这是一个半单班轮,由 BurhanKhalid 提供:

def trad(coding_strand): 
    mRNA_parts = {'A': 'U', 'T': 'A', 'G': 'C', 'C': 'G'}
    return ''.join([mRNA_parts[nucleotide] for nucleotide in coding_strand.upper()])

一个完整的单行:

def trade(coding_strand, key={'A': 'U', 'T': 'A', 'G': 'C', 'C': 'G'}): ''.join(return [key[i] for i in coding_strand.upper()])

一些参考资料:

于 2013-02-23T18:42:11.333 回答