2013-07-13 3 views
0

я имею следующую формулу:поиска идентичных сегментов в последовательности ДНК

C = Р * 4 (п-1) + Р * 4 (N-2) + ...... + P я * 4 (п) + Р п + 1,

Р может принимать одно от этих значений {'a','c','g','t'}, а также от a is 0, c is 1, g is 2 и t is 3. Например моя последовательность s='act', я хочу, чтобы вычислить С этой последовательности, для этого примера

  • Р = 0,
  • Р = 1,
  • Р п = 3.

Таким образом, результат C=8. Мой код выглядит следующим образом:

def identicalSegment(): 
    for i in range(1,len(s)): 
     if s[i]=='a': 
      p[i]=0 
     elif s[i]=='c': 
      p[i]=1 
     elif s[i]=='g': 
      p[i]=2 
     elif s[i]=='t': 
      p[i]=3 

    c=p[1]*4(pow(n-1))+p[2]*(pow(n-2))+p[n]+1 

    return c 

Я пытаюсь сделать это с питоном, но у меня возникают проблемы с , если это заявления. Любые идеи?

+2

Покажите нам часть своего кода – turnt

+0

Разве n представляет собой место в списке или что-то еще?Чуть более подробно будет способствовать – erdekhayser

+0

четкости (identicalSegment): для г в диапазоне (1, Len (ы)): , если с [я] == 'а': р [I] = 0 ELIF s [i] == 'c': p [i] = 1 elif s [i] == 'g': p [i] = 2 elif s [i] == 't': p [ i] = 3 c = p [1] * 4 (pow (n-1)) + p [2] * (pow (n-2)) + p [n] +1 return c – m28

ответ

4

Вы можете избежать некрасивых if сек, используя словарь, как это:

code={'a':0,'c':1,'g':2,'t':3} 
p=[code[i] for i in s] 

Также отметим, что в Python индексы начинаются с 0, а не 1.

Наконец, для расчета c, вы должны итерации более p. Вам нужна работа над этой частью кода.

+0

спасибо, но для p индексы начинаются с 1 – m28

+0

@ m28 факта, что в формуле P начинается с индекса 1, не имеет значения - список 'p', который вы используете, начинается с индекса 0, поэтому' p [1] 'является вторым членом' p' и т. д. – Bitwise

1

Использование Bitwise's Ответ для генерации значений P, что-то вроде следующего дает ожидаемый результат 8.

def identical_segment(input_string): 

    # get the P values from the dictionary 
    code = {"a": 0, "c": 1, "g": 2, "t": 3} 
    p = [code[i] for i in input_string] 

    # calculate length 
    n = len(input_string) 
    c = 0 

    # calculate the score 
    for i, n in enumerate(range(n, 0, -1)): 
     c += p[i]*(4**(n - 1)) 

    # add one to the return value to account for the last digit 
    return c + 1 

Run в моем терминале Python это дает:

>>> identical_segment("act") 
... 8 

Или

>>> identical_segment("gattaca") 
... 9157 

:)

+0

Я пытался оставить часть работы для OP ... :) – Bitwise

+0

Ах да ... учить рыбе :) –

+0

спасибо, но когда я пытаюсь запустить этот код, у меня всегда есть тот же результат 1 – m28

0

CODE_VALUES = {'a':0,'c':1,'g':2,'t':3} 
MAGIC_VALUE_ONE = 4 

def GetValues(lst): 
    n = len(lst) 
    for index, item in enumerate(lst): 
     P = CODE_VALUES[item] 
     multiplier = pow(MAGIC_VALUE_ONE, n - index - 1) 
     yield P * multiplier 

def CalculateSum(calc_string): 
    return sum(GetValues(calc_string)) + 1 

print CalculateSum('act') 
+0

спасибо, если я хочу применить это в файле fasta, что мне делать? – m28

+0

Что такое Fasta-файл? –

+0

это текстовый формат файла, который содержит последовательности ДНК – m28

0

Вы можете использовать это вместо dict.

p = ['acgt'.find(i) for i in s] 
Смежные вопросы