Хорошо, код ниже должен помочь. Я очистил ваш словарь, чтобы получить только заменяющие значения.
Что делает код, так это находит все места в длинной строке, которую вы ему даете, где есть "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
для создания два списка из ключей и значений словаря смотрите здесь .