字典和函数基因映射输出未返回预期频率

Dictionary and function gene mapping output not returning expected frequencies

几个小时以来,我一直试图弄清楚这段生物信息学代码有什么问题,但我看不出。我的功能部分似乎可以工作,但它没有看到某些模式。我正在使用滑动 window 函数来 return 长度为 k 的特定碱基对组合出现在一段文本中的次数。

我需要的第一个函数实质上是创建核苷酸串的四进制数的索引:

nucs = {'A':0,'C':1,'G':2,'T':3}
def PatternToNumber(Pattern):
    index = 0
    power = []
    for i in range(len(Pattern)-1,-1,-1):
        power.append(i)
    for i in range(len(Pattern)):
        index += nucs[Pattern[i]]*(4**power[i])
    return index

我使用的下一个函数迭代了一段文本,并将 1 添加到频率数组中的索引。

def ComputingFrequencies(Text,k):
    FrequencyArray = [0]*(4**k)
    for i in range(len(Text)-k):
        Pattern = Text[i:i+k]
        index = PatternToNumber(Pattern)
        FrequencyArray[index] += 1
    print(*FrequencyArray)

就像我说的,我已经查看了每一行,它似乎可以很好地将核苷酸模式按照我期望的方式放入索引号中,但是你得到的输出是 运行:

ComputeFrequencies('ACGCGGCTCTGAAA',2)

是:

1 1 0 0 0 0 2 2 1 2 1 0 0 1 1 0

如果您查看 FrequencyArray 中的第一个数字,它会告诉我们字符串 'AA' 只显示 1,但文本输入中的最后三个字符是 'AAA' 这意味着 'AA' 出现两次并且 FrequencyArray 中的第一个条目应该是 2 而不是 1。我们应该期望的是:

2 1 0 0 0 0 2 2 1 2 1 0 0 1 1 0

如果我没有解释清楚,如果需要的话,我可以试着澄清一下我的代码。

我很确定你只差了 1 个错误。因为您只是没有检查到最后一个字符?

for i in range(len(Text)-k):

对于长度 2,它只会迭代到第一个 AA,因此您只会看到它一次。更改为

for i in range(len(Text)-(k-1)):

而且我认为这应该可以满足您的需求。