首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >计算模式频率

计算模式频率
EN

Stack Overflow用户
提问于 2016-06-10 13:01:17
回答 1查看 596关注 0票数 1

我试图制作一个程序,通过文本搜索,并根据所需的kmer长度提取模式。然后,我希望它使用我从课堂上学到的算法将这些模式转换成一个数字,并将这些值存储到字典中,这样我就可以计算每个模式的频率。我知道我可以用模式本身来完成这个任务,但是任务的目标是返回一系列数字(例如:2 2 2 1 1 3 2)。

到目前为止,我能够递归地调用pat2num函数,但是我无法得到它来计算算法,4 * pat2Num(pattern) + symbol。我甚至还没试过用字典。

代码语言:javascript
复制
bases = {'A': 0, 'C': 1, 'G': 2, 'T': 3}


class ComputingFrequencies:
    def __init__(self, text, k, list):
        self.text = text
        self.k = k
        self.list = list  

    def patternGenerator(self):
        return self.freqPat(self.text, self.k)  #begins the class call

    def freqPat(self, text, k):
        for i in range(0, len(text) - k + 1):   #searches length of text corresponding to size of kmer
            pattern = text[i : k + i]           #pulls out kmer
            self.list.append(pattern)           #appends kmer to list
            print self.list
        return self.pat2Nums(list)              #calls pat2Nums

    def pat2Nums(self, list):
        if len(self.list) == 0:
            return 0
        else:
            for pattern in self.list:           #calls pat2Num for each pattern in list
                self.pat2Num(pattern)        

    def pat2Num(self, pattern):
        if len(pattern) == 0:
            self.list = self.list[1:]           
            self.pat2Nums(self.list)
        else:
            symbol = pattern[-1]                #symbol is last char of pattern
            pattern = pattern[0 : -1]           #pattern is (pattern - last char)
            if symbol in bases:
                symbol = bases[symbol]          #symbol becomes number equivalent
                print symbol
                l = 4 * self.pat2Num(pattern) + symbol   #algorithm for turning pattern into number


 c = ComputingFrequencies('AGTAGT', 3, list())
 c.patternGenerator()

更新:我终于得到了一些有用的东西,产生了所需的输出。还需要将所有可能的结果初始化为0,因此产生了很大的输出,大部分为0(万一您运行它)。下面是代码:

代码语言:javascript
复制
import sys
sys.setrecursionlimit(10000)

bases = {'A': 0, 'C': 1, 'G': 2, 'T': 3}
algNum = list()
freqArray = dict()

class ComputingFrequencies:
    def __init__(self, text, k, list, list2):
        self.text = text
        self.k = k
        self.list = list
        self.list2 = list2  

    def patternGenerator(self):
        return self.freqPat(self.text, self.k)  #begins the class call

    def freqPat(self, text, k):
        for i in range(0, 4**k):
            freqArray[i] = 0
        for i in range(0, len(text) - k + 1):   #searches length of text corresponding to size of kmer
            pattern = text[i : k + i]           #pulls out kmer
            self.list.append(pattern)           #appends kmer to list
            print self.list
        return self.pat2Nums(list)              #calls pat2Nums

    def pat2Nums(self, list):
        if len(self.list) == 0:
            l = str(freqArray.values())
            m = l.replace(",", "")
            print m
            #r = open('file')
            #r.write(m)
        else:
            pattern = self.list[0]
            return self.pat2Num(pattern)        

    def pat2Num(self, pattern):
       symbol = pattern[-1]                #symbol is last char of pattern
       pattern = pattern[0 : -1]           #pattern is (pattern - last char)
       if symbol in bases:
            symbol = bases[symbol]         #symbol becomes number equivalent
            algNum.append(symbol)
       if len(pattern) > 0:
            return self.pat2Num(pattern)
       else:
            self.algNum(algNum, self.k)

    def algNum(self, list, k):
        while len(algNum) > 0:
            if len(algNum) == self.k:
                symbol = algNum[-1]
                prev = symbol
            else:
                symbol = algNum[-1]
                alg = 4 * prev + symbol
                prev = alg
            del algNum[-1]
        freqArray[alg] = freqArray.get(alg, 0) + 1
        self.list = self.list[1:]
        return self.pat2Nums(self.list)

 c = ComputingFrequencies('AGTAGT', 3, list())
 c.patternGenerator()

基本上,我把算法从原来的位置拉出来,把符号值存储在另一个列表中,然后在模式长度达到0的时候,通过算法运行这个数字列表。它可能不是最漂亮/最简单/最好的,但它起作用了。感谢所有的编辑!

另外,请注意递归极限的增加。我知道这可能不太好。任何关于迭代器的建议都是受欢迎的(我还没学到呢!)

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-06-13 07:38:13

问题似乎在于您的函数pat2Num()和计算l的行。我们还不太清楚l应该被计算为什么。

原因是l被困在一个无限循环中,直到pattern == None。让我们走过去:

  • 启动pat2Num('AGT')
  • pattern = 'AGT'
  • symbol = 'T'
  • 模式变成'AG'
  • 计算l,但在公式中使用新模式回忆pat2Num('AG')
  • 这意味着l从未作为任何内容进行计算或存储,因为以前对pat2Num()的调用从未返回任何要存储在l中的内容。
  • 一旦函数被重新启动,symbol现在变成G
  • pattern现在变成A
  • 计算l,但回想一下pat2Num('A'),从不在l中存储任何内容
  • symbol现在变成A
  • pattern现在变成None
  • 计算l,但现在pattern不算什么,所以要么是无类型错误,要么是无限循环。

回过头来想一想l = 4 * self.pat2Num(pattern) + symbol行,也许在回忆函数之前计算l并存储在某个地方。那么和值就是list或类似的东西。

希望这能有所帮助

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/37748972

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档