所以我理解如何使用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')
但是我收到一条错误消息,指出需要整数输入。
答案 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'