Изменить подстроки в большей строке на основе вероятности - PullRequest
0 голосов
/ 17 апреля 2020

Для некоторого общего контекста у меня есть набор вероятностей для каждого типа 3-буквенной подстроки (всего 64 комбинации) в моей последовательности, чтобы перейти к другой данной 3-буквенной подстроке. Я хочу иметь возможность применить эти вероятности к каждой трехбуквенной подстроке в моей последовательности и изменить их, если вероятность показывает, что это должно быть.

По сути, я хочу произвольно изменить 3-буквенную подстроку в очень большой строке на другую 3-буквенную подстроку на основе известных вероятностей.

Например:

У меня есть строка.

'GACTCGTAGCTAGCTG'

У меня есть некоторые вероятности для подстроки 'GA C'

{'GAC>GAT': 0.05, 'GAC>GAG': 0.01 'GAC>GAA':0.03}

В этом случае у меня будет 5% шанс «GA C» в моей строке изменить на «GAT», 1% шанс «GA C» изменить на «GAG» и 3% изменить «GA *» 1017 * 'меняется на' GAA '. Какой самый эффективный способ применить эти вероятности для каждой трехбуквенной подстроки в моей гигантской строке?

1 Ответ

0 голосов
/ 17 апреля 2020

Хорошо, код ниже должен помочь. Я очистил ваш словарь, чтобы получить только заменяющие значения.

Что делает код, так это находит все места в длинной строке, которую вы ему даете, где есть "GAC", а затем для каждого из этих мест случайным образом выбирает, чем его заменить (именно поэтому я включил «GA C» в словарь - поэтому он заменит «GA C» на «GA C» в 91% случаев). Затем random_replace возвращает обновленную строку.

Обратите внимание, что аннотации str и dict предназначены только для того, чтобы помочь вам понять, что передавать, и не нужно, если они вам не нужны .

import re
import random

test_string = 'GAC' * 100

replace_map = {'GAT': 0.05, 'GAG': 0.01, 'GAA': 0.03, 'GAC': 0.91}

def random_replace(to_replace: str, full_string: str, replace_map: dict) -> str:
    replace_indices = [i.start() for i in re.finditer(to_replace, full_string)]
    population, weights = list(zip(*replace_map.items()))
    print(population, weights)

    for i in replace_indices:
        full_string = full_string[:i] + random.choices(population, weights)[0] + full_string[i+len(to_replace):]

    return full_string

if __name__ == "__main__":
    print(random_replace("GAC", test_string, replace_map))

Чтобы узнать больше о random.choices, ссылка на этот пост SO .

Чтобы узнать больше о том, почему я использую zip для создания два списка из ключей и значений словаря смотрите здесь .

...