Pracuję nad prostym licznikiem nukleotydowym w Pythonie 2.7, a na jednej z metod, które napisałem, chciałbym wydrukować wartości G, C, A, T posortowane według liczby razy pojawiają się w genie arkusz. Co może być lepszym sposobem na to? Z góry dziękuję!

 def counting(self):
    gene = open("BRCA1.txt", "r")
    g = 0
    a = 0
    c = 0
    t = 0
    gene.readline()
    for line in gene:
        line = line.lower()
        for char in line:
            if char == "g":
                g += 1
            if char == "a":
                a += 1
            if char == "t":
                t += 1
            if char == "c":
                c += 1
    print "number of g\'s: %r" % str(g)
    print "number of c\'s: %r" % str(c)
    print "number of d\'s: %r" % str(a)
    print "number of t\'s: %r" % str(t)
1
wombatp 1 grudzień 2013, 02:06

2 odpowiedzi

Najlepsza odpowiedź

Użyj collections.Counter klasa.

from collections import Counter
def counting(self):
    with open("BRCA1.txt", "r") as gene:
        nucleotide_counts = Counter(char for line in gene for char in line.lower().strip())
    for (nucleotide, count) in nucleotide_counts.most_common():
        print "number of %s's: %d" % (nucleotide, count)

Jeśli twoje linie mogą zawierać rzeczy poza nukleotydami, powinno to działać:

from collections import Counter
def counting(self):
    nucleotides = frozenset(('g', 'a', 't', 'c'))
    with open("BRCA1.txt", "r") as gene:
        nucleotide_counts = Counter(char for line in gene for char in line.lower() if char in nucleotides)
    for (nucleotide, count) in nucleotide_counts.most_common():
        print "number of %s's: %d" % (nucleotide, count)

Ta wersja nie wymaga strip, ponieważ nowe i inne białe znaki będą wykluczone przez sprawdzanie członkostwa.

4
Peter DeGlopper 30 listopad 2013, 22:24

Użyj licznik klasa.

from collections import Counter
counter = Counter(char for line in gene for char in line.lower() )
for char, count in counter.most_common():
    print "number of %s\'s: %d" % (char, count)
6
shx2 30 listopad 2013, 22:08