Pythonic способ заменить символы - PullRequest
0 голосов
/ 28 февраля 2019

Я хочу заменить некоторые символы в строке, используя питонический подход.

A -> T
C -> G
G -> C
T -> A

Пример:

AAATCGATTGAT

преобразуется в

TTTAGCTAACTA

Что я сделал:

def swap(string):
    string = re.sub('A', 'aux', string)
    string = re.sub('T', 'A', string)
    string = re.sub('aux', 'T', string)
    string = re.sub('C', 'aux', string)
    string = re.sub('G', 'C', string)
    string = re.sub('aux', 'G', string)

    return string

Это сработало замечательно, но я ищу более питонский способ достичь этого.

Ответы [ 2 ]

0 голосов
/ 28 февраля 2019

Вот рефакторинг принятого в настоящее время ответа, который вызывает только maketrans один раз.

tt = str.maketrans({"A":"T", "C":"G", "G":"C", "T": "A"})
for s1 in "AGACAT", "TAGGAC", "ACTAGAA":
    print(s1.translate(tt)

Возможно, также отметим, что вы можете связать результат с replace, хотя это все еще неуклюже и неэффективно:

def acgtgca(s1):
    return s1.replace(
        "A", "\ue0fa").replace(
        "G", "\ue0fb").replace(
        "C", "G").replace(
        "T", "A").replace(
        "\ue0fb", "C").replace(
        "\ue0fa", "T")

Это позволяет избежать использования «aux» в качестве специального маркера в пользу двух произвольных символов из Юникода Область частного использования .

Но, опять же,maketrans метод более аккуратный и эффективный.

0 голосов
/ 28 февраля 2019

Используйте словарь с пониманием и str.join:

translateDict = {
  "A" : "T",
  "C" : "G",
  "G" : "C",
  "T" : "A"
}

s1 = "AAATCGATTGAT"
reconstructed = "".join(translateDict.get(s, s) for s in s1)

Здесь у вас есть живой пример

Обратите внимание на использование dict.get;в случае, если буквы нет в словаре, мы просто оставим ее как есть.

Как подсказывает @ bravosierra99, вы также можете просто использовать str.translate:

reconstructed = s1.translate(string.maketrans(translateDict))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...