用Python替换字符串中的多个字母

时间:2015-01-02 17:45:23

标签: python string replace reverse bioinformatics

所以我理解如何使用str.replace()替换字符串中的单个字母,我也知道如何使用以下replace_all函数:

def replace_all(text, dic):
for i, j in dic.iteritems():
    text = text.replace(i,j)
return text

但我正在尝试互相替换字母。例如,将每个A替换为T,将每个T替换为A,每个C替换为G,每个G替换为C,但我最终得到的字符串仅由两个字母组成,例如A和G或C和T,而我知道输出应该由四个字母组成。这是我尝试过的代码(我宁愿避免使用内置函数):

d={'A': 'T', 'C': 'G', 'A': 'T', 'G': 'C'}
DNA_String = open('rosalind_rna.txt', 'r')
DNA_String = DNA_String.read()


reverse = str(DNA_String[::-1])


def replace_all(text, dic):
    for i, j in dic.iteritems():
        text = text.replace(i,j)
    return text


complement = replace_all(reverse, d)
print complement 

我也尝试过使用:

complement = str.replace(reverse, 'A', 'T')
complement = str.replace(reverse, 'T', 'A')
complement = str.replace(reverse, 'G', 'C')
complement = str.replace(reverse, 'C', 'G')

但我最终得到的字符串应该是它的四倍。

我也尝试过:

complement = str.replace(reverse, 'A', 'T').replace(reverse, 'T', 'A').replace(reverse, 'G', 'C')str.replace(reverse, 'C', 'G')

但是我收到一条错误消息,指出需要整数输入。

3 个答案:

答案 0 :(得分:1)

您可以将每个字母映射到另一个字母。

>>> M = {'A':'T', 'T':'A', 'C':'G', 'G':'C'}
>>> STR = 'CGAATT'
>>> S = "".join([M.get(c,c) for c in STR])
>>> S
'GCTTAA'

答案 1 :(得分:0)

您可能应该使用str.translate。使用string.maketrans创建相应的转换表。

>>> import string
>>> d ={'A': 'T', 'C': 'G', 'G': 'C', 'T': 'A'}
>>> s = "ACTG"
>>> _from, to = map(lambda t: ''.join(t), zip(*d.items()))
>>> t = string.maketrans(_from, to)
>>> s.translate(t)
'TGAC'

顺便说一下,你用这一行得到的错误

complement = str.replace(reverse, 'A', 'T').replace(reverse, 'T', 'A')...

是隐式传递self关键字时显式传递的。执行str.replace(reverse, 'A', 'T')相当于reverse.replace('A', 'T')。因此,当您执行str.replace(...).replace(reverse, 'T', 'A')时,这相当于str.replace(str.replace(...), reverse, 'T', 'A'),即第一次替换的结果将作为self插入另一个替换中,其他参数将被移位并且{ {1}}被解释为count parameter,必须是'A'

答案 2 :(得分:-1)

我认为这种情况正在发生,因为您将所有A替换为T然后替换所有T s(以及带有A s的原始字符串中的那些。尝试使用小写字母替换,然后使用upper()转换整个字符串:

dic = {'A': 't', 'T': 'a', 'C': 'g', 'G': 'c'}
text = 'GATTCCACCGT'
for i, j in dic.iteritems():
            text = text.replace(i,j)
text = text.upper()

gives:

'CTAAGGTGGCA'