【问题标题】:Change substrings in a larger string based on probability根据概率更改较大字符串中的子字符串
【发布时间】:2020-04-17 09:37:43
【问题描述】:

对于某些整体情况,我的序列中每种类型的 3 字母子串(总共 64 种组合)都有一组概率更改为另一个给定的 3 字母子串。我希望能够将这些概率应用于我序列中的每个 3 个字母的子字符串,并在概率表明应该更改它们时更改它们。

本质上,我想根据已知概率将一个非常大的字符串中的 3 个字母子串随机更改为另一个 3 个字母的子串。

例如:

我有一个字符串。

'GACTCGTAGCTAGCTG'

我对子字符串“GAC”有一些概率

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

在这种情况下,我的字符串中有 5% 的机会将“GAC”更改为“GAT”,有 1% 的机会将“GAC”更改为“GAG”,以及 3% 的机会将“GAC”更改为“GAA” ' .对我的巨型字符串中的每个 3 个字母子字符串应用这些概率的最有效方法是什么。

【问题讨论】:

  • 剩下的 91% 的可能性是否保持不变?
  • 在这个例子中是的

标签: python bioinformatics mutation genome


【解决方案1】:

好的,下面的代码应该可以解决问题。我清理了你的字典,只保留了替换值。

代码的作用是在你给它的长字符串中找到所有有 "GAC" 的地方,然后为每个地方随机选择替换它的内容(这就是为什么我包括“GAC ” 在字典中-因此它将在 91% 的情况下将“GAC”替换为“GAC”)。然后random_replace 返回更新后的字符串。

请注意,strdict 的注解只是为了帮助您了解要传递的内容,如果您不想要它们,则没有必要。

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 的更多信息,请参考this SO post

要详细了解我为什么使用 zip 从字典的键和值创建两个列表,look here

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-12-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-08-23
    • 2020-03-28
    • 2017-03-27
    相关资源
    最近更新 更多