谁能解释一下这里出了什么问题:
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”。
谁能解释一下这里出了什么问题:
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
s替换为T
s ,然后再将所有T
s替换为A
s (包括您刚刚替换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()
函数为我们提供了给定“发件人”字母的代码点。
string
这会在翻译映射中逐个查找 C 代码中的字符,而不是替换所有A
s 后跟所有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'
可变数据是你的敌人 :)
看,您首先将所有A
s替换为T
s,然后在另一次迭代中,再次将所有T
s替换为A
s。
什么有效:
# for Creek and Watson's sake, name your variables sensibly
complements = {ord('A'):'T', ord('C'):'G', ord('T'):'A', ord('G'):'C'}
sequence = "AGCTTCAG"
print(sequence.translate(complements))
它打印TCGAAGTC
。