2013-06-04 3 views
2

Я пытаюсь рассчитать содержание GC (в%) последовательности ДНК для вопроса Rosalind. У меня есть следующий код, но он возвращает 0 или только количество G в одиночку или только C (без процентов).Начальный скрипт Python для вычисления содержания GC в последовательности ДНК

x = raw_input("Sequence?:").upper() 
total = len(x) 
c = x.count("C") 
g = x.count("G") 

gc_total = g+c 

gc_content = gc_total/total 

print gc_content 

Я также попытался это, просто чтобы получить количество G и С., а не процент, но он просто возвращает счетчик всей строки:

x = raw_input("Sequence?:").upper() 
def gc(n): 
    count = 0 
    for i in n: 
     if i == "C" or "G": 
      count = count + 1 
     else: 
      count = count 
    return count 
gc(x) 

EDIT: я констатировала typo в заявлении печати в первом примере кода. Это не проблема, я просто вставил неправильный фрагмент кода (было много попыток ...)

+0

Первый может быть опечатка, но вы сказали 'cg_content' вместо 'gc_content'. Во втором примере нет необходимости в выражении else. – squiguy

+0

Я исправил его в редактировании. Это был не корень проблемы, я просто вложил неправильный блок кода из моих многочисленных попыток, пытающихся по-разному. – jstewartmitchel

ответ

1

не должны:

печати cg_content

чтения

печати gc_content?

Что касается другого фрагмента кода, ваш цикл говорит

если я == "C" или "G":

Это оценка "G" истина каждый время и, таким образом, выполнение оператора if как истинного.

Вместо этого, он должен читать

если я == "C" или я == "G":

Кроме того, вам не нужно что-то заявление.

Надеюсь, это поможет. Дайте нам знать, как это происходит.

Абдул Саттар

+0

Да, это сработало! Мое заявление было выключено. Так же быстро, как опечатка в инструкции print, это было результатом того, что я прокручивал все различные итерации кода выше, чтобы вставить пример, чтобы показать вам, ребята. Спасибо огромное! – jstewartmitchel

4

Ваша проблема в том, что вы выполняете целочисленное деление, а не деление с плавающей запятой.

Попробуйте

gc_content = gc_total/float(total) 
+0

Это исправлено. Спасибо! Есть ли вообще какие-либо причины для использования целочисленного деления? Большое спасибо за Вашу помощь. – jstewartmitchel

0

Кроме того, необходимо умножить ответ на 100, чтобы преобразовать его в процентах.

0
#This works for me. 

import sys 

filename=sys.argv[1] 

fh=open(filename,'r') 

file=fh.read() 
x=file 
c=0 
a=0 
g=0 
t=0 

for x in file: 
    if "C" in x: 
     c+=1  
    elif "G" in x: 
     g+=1 
    elif "A" in x: 
     a+=1  
    elif "T" in x: 
     t+=1 

print "C=%d, G=%d, A=%d, T=%d" %(c,g,a,t) 

gc_content=(g+c)*100/(a+t+g+c) 

print "gc_content= %f" %(gc_content) 
+1

Лучше всего на SO сопровождать блок исходного кода несколькими пояснениями. –

0
import sys 
orignfile = sys.argv[1] 
outfile = sys.argv[2] 

sequence = "" 
with open(orignfile, 'r') as f: 
    for line in f: 
     if line.startswith('>'): 
      seq_id = line.rstrip()[0:] 
     else: 
      sequence += line.rstrip() 
GC_content = float((sequence.count('G') + sequence.count('C')))/len(sequence) * 100 
with open(outfile, 'a') as file_out: 
    file_out.write("The GC content of '%s' is\t %.2f%%" % (seq_id, GC_content)) 
+0

Пожалуйста, избегайте ответов только на код. Проверьте [тур] и прочитайте [ответ] – chtz