我提供一个字符串并将其与字典键匹配;如果键和字符串匹配,我打印字典值。
def to_rna(dna_input):
dna_rna = {'A':'U', 'C':'G', 'G':'C', 'T':'A'}
rna = []
for key in dna_rna.iterkeys():
if key in dna_input:
rna.append(dna_rna[key])
print "".join(rna)
to_rna("ACGTGGTCTTAA") #the string input
结果应为“ UGCACCAGAAUU ”,但我得到的只是“ UGAC ”。问题似乎是我在字符串中有重复的字符,循环忽略了这一点。如何循环遍历字典,以便在找到dict键时多次返回字典值?
答案 0 :(得分:5)
您可以使用translate()
。编辑:我添加了正则表达式以返回错误条目的-
(似乎是一个好主意@ jh44tx):
import string
import re
rna_trans = string.maketrans("ACGTU","UGCA-")
rna_trans = re.sub("[^UGCA]","-",rna_trans)
print "ACGTGGTCTTAA".translate(rna_trans)
由于映射是1:1,您还可以创建反向转换:
rev_rna_trans = string.maketrans("UGCAT","ACGT-")
rev_rna_trans = re.sub("[^ACGT]","-",rna_trans)
答案 1 :(得分:1)
如果要为dna_input
中的每个字符输出一个字符,则需要在dna_input
中迭代字符。请注意,get()
函数为字典中不包含的字符提供默认值。我没有替换任何东西,如果需要,你可以在这里放一个n
或一个X.
rna.append(dna_rna.get(char, 'n'))
您的代码仅迭代dna_rna
字典中的4个条目。
def to_rna(dna_input):
dna_rna = {'A':'U', 'C':'G', 'G':'C', 'T':'A'}
rna = []
for char in dna_input:
rna.append(dna_rna.get(char, ''))
print "".join(rna)
to_rna("ACGTGGTCTTAA") #the string input
但是,这不是翻译字符串的最有效方式。
答案 2 :(得分:1)
由于您知道输入的每个字母都将被转换为输出字符串,因此您最好不要在每个字母上循环:
def to_rna(dna_input):
dna_rna = {'A':'U', 'C':'G', 'G':'C', 'T':'A'}
rna = []
for x in dna_input:
rna.append(dna_rna[x])
return ''.join(rna)
或者你可以用列表推导来写它
def to_rna(dna_input):
dna_rna = {'A':'U', 'C':'G', 'G':'C', 'T':'A'}
return ''.join([dna_rna[x] for x in dna_input])
答案 3 :(得分:1)
万一你认为你有时会收到垃圾信件,你可以这样做:
def to_rna(dna_input):
dna_rna={'A':'U','C':'G','G':'C','T':'A'}
rna=[]
for char in dna_input:
if char in dna_rna.keys():
rna.append(dna_rna[char])
else:
rna.append('-')
print "".join(rna)
to_rna("ACGTGGTCTTAAX")
结果是: 的 UGCACCAGAAUU - 强>
答案 4 :(得分:0)
您可以将此作为列表理解。因为这成为一个单行,它几乎使功能变得多余:
def to_rna(dna_input):
dna_rna = {'A':'U', 'C':'G', 'G':'C', 'T':'A'}
return "".join([dna_rna.get(x, '') for x in dna_input])