如何使用字符映射替换字符串中的字符?

时间:2015-10-23 21:19:32

标签: python dictionary

代码目的:

我提供一个字符串并将其与字典键匹配;如果键和字符串匹配,我打印字典值。

这是代码:

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键时多次返回字典值?

5 个答案:

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