2016-09-19 2 views
-1

Я пытаюсь написать перекос функции генома, но получает ошибку:Python перекос Геном

Failed test #2. 
Test Dataset: AGCGTGCCGAAATATGCCGCCAGACCTGCTGCGGTGGCCTCGCCGACTTCACGGATGCCAAGTGCATAGAGGAAGCGAGCAAAGGTGGTTTCTTTCGCTTTATCCAGCGCGTTAACCACGTTCTGTGCCGACTTT 
Your output: ['0', '0'] 
Correct output: ['0', '0', '1', '0', '1', '1', '2', '1', '0', '1', '1', '1', '1', '1', '1', '1', '2', '1', '0', '1', '0', '-1', '-1', '0', '0', '-1', '-2', '-2', '-1', '-2', '-2', '-1', '-2', '-1', '0', '0', '1', '2', '1', '0', '0', '-1', '0', '-1', '-2', '-1', '-1', '-2', '-2', '-2', '-3', '-3', '-4', '-3', '-2', '-2', '-2', '-1', '-2', '-3', '-3', '-3', '-2', '-2', '-1', '-2', '-2', '-2', '-2', '-1', '-1', '0', '1', '1', '1', '2', '1', '2', '2', '3', '2', '2', '2', '2', '3', '4', '4', '5', '6', '6', '6', '6', '5', '5', '5', '5', '4', '5', '4', '4', '4', '4', '4', '4', '3', '2', '2', '3', '2', '3', '2', '3', '3', '3', '3', '3', '2', '1', '1', '0', '1', '1', '1', '0', '0', '1', '1', '2', '1', '0', '1', '1', '0', '0', '0', '0'] 

Моего код:

Genome = "CATGGGCATCGGCCATACGCC" 
def SymbolArray(Genome, symbol): 
    array = {} 
    n = len(Genome) 
    ExtendedGenome = Genome + Genome[0:n//2] 
    for i in range(n): 
     array[i] = PatternCount(symbol, ExtendedGenome[i:i+(n//2)]) 
    return array 
def Skew(Genome): 
    skew = {} 
    skew[0]=0 
    n = len(Genome) 
    for i in range(1, n+1):  
     skew[i] = skew[i-1] 
     if Genome[i-1] == "G": 
      skew[i] = skew[i-1]+1 
     elif Genome[i-1] == "C": 
      skew[i] = skew[i-1]-1 
     else: 
      skew[i] = skew[i-1] 
     return skew 
    for i in skew.items(): 
     Skew(Genome) 

ответ

1

Проблема проще, чем вы делаете это. Самые большие проблемы выглядят следующим образом: ваш оператор return находится в цикле, а не после него; вы используете словарь, где вам нужен массив; конец вашего диапазона отключен на 1; у вас есть ненужный рекурсивный вызов Skew().

Вот рабочее упрощение кода:

Genome = "AGCGTGCCGAAATATGCCGCCAGACCTGCTGCGGTGGCCTCGCCGACTTCACGGATGCCAAGTGCATAGAGGAAGCGAGCAAAGGTGGTTTCTTTCGCTTTATCCAGCGCGTTAACCACGTTCTGTGCCGACTTT" 

def Skew(genome): 
    skew = [0] 

    for i in range(1, len(genome)):  
     skew.append(skew[-1]) 

     if genome[i - 1] == "G": 
      skew[i] = skew[i - 1] + 1 
     elif genome[i - 1] == "C": 
      skew[i] = skew[i - 1] - 1 

    return skew 

print(Skew(Genome)) 

Can you also let me know can I use it in dictionary form?

Если вы хотите, чтобы skew контейнер быть словарем, как в вашем оригинале, вы можете сделать следующее:

def Skew(genome): 
    skew = {0:0} 

    for i in range(1, len(genome)): 

     if genome[i - 1] == "G": 
      skew[i] = skew[i - 1] + 1 
     elif genome[i - 1] == "C": 
      skew[i] = skew[i - 1] - 1 
     else: 
      skew[i] = skew[i - 1] 

    return [value for (key, value) in sorted(skew.items())] 

Я не рекомендую, однако. Словари обычно используются для представления разреженных массивов, но здесь это не так. Другой способ реализовать это с помощью OrderedDict - это позволит вам избежать понимания списка и просто вернуть skew.values().

+0

Спасибо Я пытаюсь изучить Python без предварительного знания. Можете ли вы также сообщить мне, могу ли я использовать его в форме словаря? Если да, то какой будет код? – Azia

+0

@ Азия, я также добавил словарное решение. – cdlane

+0

Спасибо, я сделал это. Я новичок в этом форуме, поэтому не знаю этих вещей :) – Azia

0
def Skew(Genome): 
    skew = {} 

    for base in range(1, len(Genome)+1): # since we start at 1 and not 0 as we should we are adding one to the length 

     if Genome[base - 1] == "G": # subtracting one since we start at one so base at the 0 position has to be included 
      skew[base] = skew[base - 1] + 1 
     elif Genome[base - 1] == "C": 
      skew[base] = skew[base - 1] - 1 
     else: 
      skew[base] = skew[base - 1] 


    return skew 
Смежные вопросы