根据字典替换字符串

时间:2013-06-11 01:45:44

标签: python replace

我正在尝试将我的字符串中的密码子转换为氨基酸。

这就是我目前所拥有的:

def converteRNAmParaAminoacidos(rna):
    dicionario = {'uuu':'F', 'uuc':'F','uua':'L', 'uug':'L', 'cuu':'L', 'cuc':'L', 'cua':'L', 'cug':'L', 'auu':'I', 'auc':'I', 'aua':'I', 'aug':'M', 'guu':'V', 'guc':'V', 'gua':'V', 'gug':'V', 'ucu':'S', 'ucc':'S', 'uca':'S', 'ucg':'S', 'ccu':'P', 'ccc':'P', 'cca':'P', 'ccg':'P', 'acu':'T', 'acc':'T', 'aca':'T', 'acg':'T', 'gcu':'A', 'gcu':'A', 'gcc':'A', 'gca':'A', 'gcg':'A', 'uau':'T', 'uac':'T', 'uaa':'*', 'uag':'*', 'cau':'H', 'cac':'H', 'caa':'G', 'cag':'G', 'aau':'N', 'aac':'N', 'aaa':'K', 'aag':'K', 'gau':'D', 'gac':'D', 'gaa':'E', 'gag':'E', 'ugu':'C', 'ugc':'C', 'uga':'*', 'ugg':'W', 'cgu':'R', 'cgc':'R', 'cga':'R', 'cgg':'R', 'agu':'S', 'agc':'S', 'aga':'R', 'agg':'R', 'ggu':'G', 'ggc':'G', 'gga':'G', 'ggg':'G'}
    for i,j in dicionario.iteritems():
        aminoacidos=rna.replace(i,j)
    return aminoacidos

然而,它不起作用,它只取代了最后一个密码子。

4 个答案:

答案 0 :(得分:2)

在Python中,replace函数返回一个新字符串。你正在做的是取原始字符串,进行替换并将结果存储为aminoacidos。当您再次呼叫replace时,由于您再次在原始未更改的字符串上调用replace,因此您不会保留先前迭代的结果。

您需要像以下那样重复使用aminoacidos

aminoacidos = rna

for tripleto, cambio in dicionario.iteritems():
    aminoacidos = aminoacidos.replace(tripleto, cambio)
return aminoacidos

答案 1 :(得分:2)

在循环中,您不会修改aminoacidos。你只需每次迭代重新设置它。

虽然替换可能似乎就像它会起作用,但替换的顺序会有所不同。以ucuuuc为例。如果您先替换ucu,则最终会使用Suuc。但是,如果您首先找到cuu,则会获得uLuc,这会导致后续替换。

您应该以三个块的形式迭代字符串,并在字典中查找每个字符串:

# I'd choose a better variable name
dicionario = {'uuu':'F', 'uuc':'F','uua':'L', 'uug':'L', 'cuu':'L', 'cuc':'L', 'cua':'L', 'cug':'L', 'auu':'I', 'auc':'I', 'aua':'I', 'aug':'M', 'guu':'V', 'guc':'V', 'gua':'V', 'gug':'V', 'ucu':'S', 'ucc':'S', 'uca':'S', 'ucg':'S', 'ccu':'P', 'ccc':'P', 'cca':'P', 'ccg':'P', 'acu':'T', 'acc':'T', 'aca':'T', 'acg':'T', 'gcu':'A', 'gcu':'A', 'gcc':'A', 'gca':'A', 'gcg':'A', 'uau':'T', 'uac':'T', 'uaa':'*', 'uag':'*', 'cau':'H', 'cac':'H', 'caa':'G', 'cag':'G', 'aau':'N', 'aac':'N', 'aaa':'K', 'aag':'K', 'gau':'D', 'gac':'D', 'gaa':'E', 'gag':'E', 'ugu':'C', 'ugc':'C', 'uga':'*', 'ugg':'W', 'cgu':'R', 'cgc':'R', 'cga':'R', 'cgg':'R', 'agu':'S', 'agc':'S', 'aga':'R', 'agg':'R', 'ggu':'G', 'ggc':'G', 'gga':'G', 'ggg':'G'}

def converteRNAmParaAminoacidos(rna):
    aminoacidos = ''

    for i in range(0, len(rna), 3):
        aminoacidos += dicionario[rna[i:i + 3]]

    return aminoacidos

或者更简洁:

def converteRNAmParaAminoacidos(rna):
    return ''.join([dicionario[rna[i:i + 3]] for i in range(0, len(rna), 3])

答案 2 :(得分:1)

您可能还想查看内置的Template类,它基本上就是您要在此处执行的操作。

from string import Template
s = Template('$who likes $what')
s.substitute(who='tim', what='kung pao')
'tim likes kung pao'
d = {'who':'tom', 'what':'moo shoo'}
s.substute(d) #pass same keywords as a dictionay
'tom likes moo shoo'

答案 3 :(得分:0)

您只保存aminoacidos变量的最后一个替换。我更改了代码以替换rna字符串并将其设置为rna。它应该工作。

def converteRNAmParaAminoacidos(rna):
    dicionario = {'uuu':'F', 'uuc':'F','uua':'L', 'uug':'L', 'cuu':'L', 'cuc':'L', 'cua':'L', 'cug':'L', 'auu':'I', 'auc':'I', 'aua':'I', 'aug':'M', 'guu':'V', 'guc':'V', 'gua':'V', 'gug':'V', 'ucu':'S', 'ucc':'S', 'uca':'S', 'ucg':'S', 'ccu':'P', 'ccc':'P', 'cca':'P', 'ccg':'P', 'acu':'T', 'acc':'T', 'aca':'T', 'acg':'T', 'gcu':'A', 'gcu':'A', 'gcc':'A', 'gca':'A', 'gcg':'A', 'uau':'T', 'uac':'T', 'uaa':'*', 'uag':'*', 'cau':'H', 'cac':'H', 'caa':'G', 'cag':'G', 'aau':'N', 'aac':'N', 'aaa':'K', 'aag':'K', 'gau':'D', 'gac':'D', 'gaa':'E', 'gag':'E', 'ugu':'C', 'ugc':'C', 'uga':'*', 'ugg':'W', 'cgu':'R', 'cgc':'R', 'cga':'R', 'cgg':'R', 'agu':'S', 'agc':'S', 'aga':'R', 'agg':'R', 'ggu':'G', 'ggc':'G', 'gga':'G', 'ggg':'G'}
    for i,j in dicionario.iteritems():
        rna = rna.replace(i, j)
    return rna