我写了一个简单的程序,将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)
为什么会出现这种奇怪的行为,我该如何解决?
答案 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()])
一些参考文献: