"Python - 计算核苷酸数量"

2024-10-06 11:22:15 发布

您现在位置:Python中文网/ 问答频道 /正文

所以我要设计一个程序来计算DNA序列和计算单个碱基对。到目前为止,我得到的是:

class dnaString (str): 
    def __new__(self,s): 
        return str.__new__(self,s.upper()) 
    def length (self): 
        return (len(self)) 
    def getATCG (self,num_A,num_T,num_C,num_G): 
        num_A = self.count("A") 
        num_T = self.count("T") 
        num_C = self.count ("C") 
        num_G = self.count ("G") 
        return ( (self.length(), num_A, num_T, num_G, num_C) ) 

    def printnum_A (self): 
        print ("Adenine base content: {0}".format(self.count("A"))) 

dna = input("Enter a dna sequence: ") 
x=dnaString(dna) 

这个程序实际上什么也做不了,而且由于我刚开始使用python,所以我不确定如何修复它,使它正常工作。我还需要补充什么?我知道还没完成。在


Tags: self程序newreturndefcount序列upper
3条回答

我不确定问题出在哪里,但由于您没有调用方法“printnum_A”,因此没有任何内容在打印。如果你这样称呼它,它会起作用:

dna = input("Enter a dna sequence: ") 
x=dnaString(dna) 
x.printnum_A()

根据评论更新

仅仅声明类的方法是不够的,还需要在需要时调用它们。例如printnum_T

^{pr2}$

这有帮助吗?它可以在我碰巧安装的python2.7.3和3.2.3中工作。在

import itertools
import sys

def pairwise(iterable):
    "s -> (s0,s1), (s1,s2), (s2, s3), ..."
    a, b = itertools.tee(iterable)
    next(b, None)
    if sys.version_info[0] > 2:
        return zip(a,b)
    return itertools.izip(a, b)

class DnaSequence():
    Names = {
        'A' : 'adenine',
        'C' : 'cytosine',
        'G' : 'guanine',
        'T' : 'thymine'
    }
    Bases = Names.keys()


    def __init__(self, seq):
        self._string = seq
        self.bases = { x:0 for x in DnaSequence.Bases }
        self.pairs = { x+y:0 for x in DnaSequence.Bases 
                             for y in DnaSequence.Bases }

        for base in seq:
            if base in self.bases:
                self.bases[base] += 1

        for x,y in pairwise(seq):
            pair = x+y
            if pair in self.pairs:
                self.pairs[pair] += 1


    def printCount(self, base):
        if base in DnaSequence.Names:
            print(DnaSequence.Names[base].capitalize() + 
                  " base content: " + str(self.bases[base]))
        else:
            sys.stderr.write('No such base ("%s")\n' % base)


    def __repr__(self):
        return self._string


d = DnaSequence("CCTAGTGTTAGCTAGTCTAGGGAT")
for base in DnaSequence.Bases:
    d.printCount(base)

# Further:
print(d)
print(d.bases)
print(d.pairs)

这是一个完整的例子,计算基数(a,C,G,T)和所有相邻对的出现(例如,在ACCGTA中,AC、CC、CG、GT、TA都是1,笛卡尔乘积ACGT x ACGT的其他11个可能组合都是0)。在

这里使用的计数方法在构造函数中扫描一次字符串,而不是每次调用getATGC()时扫描它四次。在

我觉得这门课可以简化一点:

class DnaString(str): 
    def __new__(self, s): 
        return str.__new__(self, s.strip().upper())

    def __init__(self, _):
        self.num_A = self.count("A") 
        self.num_C = self.count("C") 
        self.num_G = self.count("G") 
        self.num_T = self.count("T") 

    def stats(self):
        return len(self), self.num_A, self.num_C, self.num_G, self.num_T

那么

^{pr2}$

给予

Enter a dna sequence: ACGTACGTA
ACGTACGTA
(9, 3, 2, 2, 2)

相关问题 更多 >