3

谁能解释一下这里出了什么问题:

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”。

4

2 回答 2

6

您首先将所有As替换为Ts ,然后再将所有Ts替换为As (包括您刚刚替换As 的那些!):

>>> 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 代码中的字符,而不是替换所有As 后跟所有Ts。

str.translate()具有比一系列调用快得多的额外优势。str.replace()

演示:

>>> string = 'ACGTACG'
>>> transmap = {ord('A'): 'T', ord('C'): 'G', ord('T'): 'A', ord('G'): 'C'}
>>> string.translate(transmap)
'TGCATGC'
于 2013-09-10T15:53:43.523 回答
2

可变数据是你的敌人 :)

看,您首先将所有As替换为Ts,然后在另一次迭代中,再次将所有Ts替换为As。

什么有效:

# 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

于 2013-09-10T15:57:55.237 回答