2015-06-21 2 views
0

Я думаю, что лучший способ объяснить мое затруднительное положение - пример. Скажем, у меня есть файл, который содержит следующую информацию:Указание количества чисел для суммирования в цикле

isoform snp_rein 
NM_005101 97 
NM_005101 144 
NM_198576 20790 

и словарь, который выглядит так:

exons = {'NM_005101': [(0, 110), (517, 1073)], 'NM_198576': [(0, 251), (2078, 2340), (15154, 15202), (20542, 20758), (21050, 21275), (21355, 21580), (21833, 22040), (23116, 23335), (23415, 23610), (23700, 23901), (23986, 24135), (24211, 24317), (25038, 25155), (25236, 25401), (25610, 25754), (25841, 25966), (26037, 26143), (26274, 26613), (26697, 26835), (27204, 27332), (27450, 27565), (27653, 27773), (27889, 28243), (28744, 28937), (29113, 29329), (29443, 29673), (29780, 29915), (30110, 30207), (30304, 30469), (30603, 30715), (31130, 31247), (31330, 31523), (31605, 31693), (33630, 33855), (34325, 34429), (34701, 35997)]} 

Я работаю на некоторый код, который находит, между которыми пара чисел snp_rein номер вранье. Затем я смог вычислить разницу между максимумом первого набора чисел и min от второго набора чисел и так далее. Мой код, как показано ниже:

totalintron=0 
if name in exons: 
    y = exons[name] 
    for sd, i in enumerate(exons[name]): 
     if snpos<=max(i): 
      exonnumber = sd+1 
      position = sd 
      print exonnumber 
      break 
    for index in range(len(y) -1): 
      first_max = max(y[index]) 
      second_min = min(y[index + 1]) 
      intron = second_min - first_max 
      print intron 
      totalintron = totalintron + intron 
     print totalintron 
     totalintron = 0 

Мой выход выглядит так: (**x** указывает exonnumber и последняя цифра указывает на общее я хочу изменить):

**1** 
407 
407 
**2** 
407 
407 
**5** 
1827 
12814 
5340 
292 
80 
253 
1076 
80 
90 
85 
76 
721 
81 
209 
87 
71 
131 
84 
369 
118 
88 
116 
501 
176 
114 
107 
195 
97 
134 
415 
83 
82 
1937 
470 
272 
28671 

Моя проблема заключается в общей сложности , Я хочу суммировать только количество чисел, указанное в дополнительном номере. Для первого вывода я хотел бы, чтобы итоговое число считалось 0, потому что проверенное число находилось в пределах заданного диапазона для exon 1. Для второго выхода я хочу, чтобы общее число считалось 407, потому что оно было в exon 2. Для последнего вывода I хочу подвести первые 4 цифры, потому что тестируемый номер был в экзоне 5.

Это то, что я хочу, чтобы мой выход выглядеть следующим образом:

**1** 
0 
**2** 
407 
**5** 
20273 

Любые предложения о том, как изменить способ, которым я в общей сложности только для определенного количества чисел, если это имеет смысл? Пожалуйста, объясните, что вы предлагаете, потому что я новичок в Python ...

+0

«который пара чисел число snp_rein лежит.» Можете ли вы пояснить, что это значит? –

+0

Я бы предложил сначала разделить вашу проблему на более мелкие проблемы, которые легче решить/понять/получить помощь. Возможно, начните, потянув каждую петлю в свою собственную функцию? – thebjorn

+0

Также уточните, что именно вы хотите сделать. –

ответ

1

Вы хотите, чтобы последний внутренний цикл, чтобы выглядеть следующим образом:

# reset the `totalintron` for the current `exonnumber` 
totalintron = 0 

# only iterate `exonnumber - 1` (which is guaranteed to be len(y) - 1 at max) 
for index in range(exonnumber - 1): 
    first_max = max(y[index]) 
    second_min = min(y[index + 1]) 
    intron = second_min - first_max 
    # don’t print `intron`, we only care about the total 
    totalintron = totalintron + intron 

print totalintron 
+0

Ты потрясающий. Такое простое исправление. Большое спасибо за то, что вы пытаетесь понять мой вопрос :) – interstellar

+0

Мой хрустальный шар был сильным с этим:) Вы должны действительно попытаться объяснить, что вы пытаетесь достичь в следующий раз. Со всеми вашими экзонами и интронумерами (о которых я понятия не имею, что это такое), это довольно запутывает то, что происходит;) – poke

+0

Серьезно. Я пытался писать это в течение нескольких дней. Вы только что сделали мое воскресенье. – interstellar

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