Python中的奇怪行为

时间:2013-02-23 18:36:40

标签: python list

我写了一个简单的程序,将DNA翻译成RNA。基本上,您输入一个字符串,它将字符串分成字符并将它们发送到列表,移动字母并从结果列表中返回一个字符串。该程序正确地将a转换为u,转换为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)

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

2 个答案:

答案 0 :(得分: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()代替。

答案 1 :(得分: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()])

一些参考文献: