谁能解释一下这里出了什么问题:
def get_complementary_sequence(string):
dic = {'A':'T', 'C':'G', 'T':'A', 'G':'C'}
for a, b in dic.items():
string = string.replace(a, b)
return string
我得到了“T”和“C”的正确结果,但“A”和“C”不会被替换。真的卡住了
字符串看起来像“ACGTACG”。
最佳答案
您首先将所有 A
替换为 T
,然后再将所有 T
替换为 A
再次(包括您刚刚替换 A
s 的那些!):
>>> string = 'ACGTACG'
>>> string.replace('A', 'T')
'TCGTTCG'
>>> string.replace('A', 'T').replace('T', 'A')
'ACGAACG'
改用翻译图,提供给 str.translate()
:
transmap = {ord('A'): 'T', ord('C'): 'G', ord('T'): 'A', ord('G'): 'C'}
return string.translate(transmap)
str.translate()
方法需要字典将代码点(整数)映射到替换字符(单个字符或代码点),或者 None
(删除来自输入字符串的代码点)。 ord()
函数为我们提供给定“发件人”字母的代码点。
这会在翻译映射中逐一查找 C 代码中的 string
中的字符,而不是替换所有 A
后跟所有 T
s.
str.translate()
的额外优势是比一系列 str.replace()
调用快很多。
演示:
>>> string = 'ACGTACG'
>>> transmap = {ord('A'): 'T', ord('C'): 'G', ord('T'): 'A', ord('G'): 'C'}
>>> string.translate(transmap)
'TGCATGC'
关于Python3 使用字典替换,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18723493/