Замена символов цепочкой методов str.replace приводит к неверному результату - PullRequest
3 голосов
/ 09 марта 2020

Я хочу иметь возможность заменить определенные символы. Желаемый порядок замены должен быть
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 ]

12 голосов
/ 09 марта 2020

Использование MRNA.replace('C', 'G').replace('G', 'C') заменит любое 'C' на 'G', которое немедленно заменяется на 'C'.

Вместо нескольких str.replace вы должны использовать таблицу перевода с str.maketrans и str.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 голос
/ 09 марта 2020

Проблема в том, что каждый replace меняет последний вывод replace, то есть после запуска .replace('C', 'G') строка становится "UACC", а следующая replace заменяет все C в G, то есть вы получаете UAGG вместо UACG. Чтобы исправить это, вы можете использовать от for l oop до l oop через каждый символ и использовать 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])
0 голосов
/ 09 марта 2020

Для обмена 'G' и 'C' вы могли бы использовать 'T' в качестве буфера после замены всех оригинальных 'T' (так что вы знаете, что на данный момент нет любой 'T' в строке и, следовательно, это безопасно):

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

Похоже на не-Python обмен двух переменных c и g:

t = c
c = g
g = t

вместо

c, g = g, c
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...