通过链接str.replace方法替换字符会产生错误的结果

时间:2020-03-09 20:07:36

标签: python string replace

我希望能够替换某些字符。所需的更换订单应为
A-> U,T-> A,G-> C,C->G。

但是由于某些原因,C不会被G取代。 我已经链接了到目前为止的代码。

v = "ATGC"
DNA = [v]
MRNA = []
for s in DNA:
    MRNA.append(s.replace('A', 'U').replace('T', 'A').replace('C', 'G').replace('G', 'C'))
print(MRNA)

3 个答案:

答案 0 :(得分:12)

使用MRNA.replace('C', 'G').replace('G', 'C')会将'C'替换为'G',而'C'将立即替换为str.replace

您应该使用带有str.maketransstr.translate的转换表,而不要使用多个str.replace。由于此操作一次完成,因此既避免了撤消替换操作,又随着对def dna_to_rna(s): trans_table = str.maketrans('ATCG', 'UAGC') return s.translate(trans_table) print(dna_to_rna('ACGTAC')) # 'UGCAUG' 的调用次数增加而变得更加高效。

{{1}}

答案 1 :(得分:1)

问题是,每个replace都在改变最后一个replace的输出-这意味着在运行.replace('C', 'G')之后,字符串变成"UACC",下一个变为replace会将所有C替换为G,这意味着您将获得UAGG而不是UACG。要解决此问题,您可以使用for循环遍历每个字符并使用dictionary

def DNA_to_RNA(s):
    mask_table = {"A": "U", "T": "A", "C": "G", "G": "C"}
    result = []
    for char in s:
        result.append(mask_table[char])
    return ''.join(result)

或者,使用列表理解:

def DNA_to_RNA(s):
    mask_table = {"A": "U", "T": "A", "C": "G", "G": "C"}
    return ''.join([mask_table[char] for char in s])

答案 2 :(得分:-1)

对于交换'G''C',您可以在替换所有原始'T'后使用'T'作为缓冲区(因此,知道此时字符串中没有任何'T',因此很安全):

>>> 'ATGC'.replace('A', 'U').replace('T', 'A').replace('C', 'T').replace('G', 'C').replace('T', 'G')
'UACG'

类似于两个变量cg的非Python交换:

t = c
c = g
g = t

代替

c, g = g, c