2016-07-13 2 views
0

У меня есть следующий набор данных, мой код ниже будет идентифицировать каждую строку со словом «Query_» для поиска «*» и распечатать буквы под ним до следующей строки с «Query_»Подсчет №. символов между заголовками в python

Query_10  206 IVVTGPHKFNRCPLKKLAQSFTMPTSTFVDI*GLNFDITEQHFVKEKP**SSEEAQFFAK 385 
010718494  193 LLVTGPLVVNRVPLRRAHQKFVIATSTKVDISGVKIHLTDAYFKKKKLRKPKQEGEIFDT 255 
001291831  173 LLVTGPLSLNRVPLRRTHQKFVIATSTKIDISSVKIHLTDAYFKKKKP--RHQEGEIFDT 235 
LLVTGPLVLNRVPLRRTHQKFVIATSTKIDISNVKIHLTDAYFKKKKP--RHQEGEIFDT 235 
009246541  173 LLVTGPLVLNRVPLRRTHQKFVIATSTKIDISNVKIHLTDAYFKKKKP--RHQEGEIFDT 235 
Query_13  31 MEEQKEKGLSNPEVV*KYRQCSEIVNQVLSTVVSSCVPGADVASICTNGDFLIEDGLRNI 210 
002947167  7  IQGEQEPNLSVPEVVTKYKAAADICNRALQAVIDGCKDGSKIVDLCRTGDNFITKECGNI 66 
004993505  1  MELDRQSKVVDADALSKYRAAAAIANDCVQQLVANCIAGADVYTLAVEADTYIEQKLKEL 60 
006961234  1  MSETKEYSLNNPDTLTKYKTAAQISEKVLAAVSDLCVPGAKIVDICQQGDKLIEEELAKV 62 
008089018  1  MSEETDYTLNNPDTLTKYKTAAQISEKVLAAVAELVVPGEKIVTICEKGDKLIEEELAKV 60 
Query_13  211 EPDTNIEKGIAIPVCLNINNICSYYSPLPDASTTLQEGDLVKVDLGAHFDGYIVSAASSI 390 

Я ищу печать только в том случае, если между линиями Query_ существует строка не менее 50 или более букв. Любая помощь будет замечательной!

lines = [line.rstrip() for line in open('infile.txt')] 
for line in lines: 
    data = line.split() 
    sequence = data[2] 
    if data[0].startswith("Query_"): 
     star_indicies = [i for i,c in enumerate(sequence) if c == '*'] 
    else: 
     print(list(sequence[star_index] for star_index in star_indicies)) 

ответ

1

разбить его на этапы

Сначала найдите все строки с заголовками, и отметьте, содержат ли они звездочки:

headers = [[i,"*" in l.split()[2]] for i,l in enumerate(lines) 
      if l.startswith("Query_")] 

Так что теперь у вас есть список списков, каждый из которых содержит два значения индекса

  • в lines заголовка
  • ли этот заголовок содержит звездочку

Теперь вы можете итерацию над ней

for i, header in enumerate(headers[:-1]): # All but last 
    if not header[1]: 
     continue // No asterisk 
    this_header = header[0] 
    next_header = headers[i+1][0] 
    if (next_header - this_header -1) < 50: 
     continue // Not enough rows 
    ... 

... выше, где вы положили код, чтобы выяснить, какие столбцы lines[this_header] содержат звездочку, а затем извлечь эти столбцы от lines[this_header+1] до lines[next_header-1].

Я оставил это немного для вас, как вашего вопроса недоопределенного

  • конца ли файл с строкой заголовка «Query_»?
  • Если нет, то как вы относитесь к случаю, когда конечная строка заголовка имеет звездочки, а за ней следуют еще 100 строк?
  • Что вы подразумеваете под «напечатать буквы под ним»?

Но это должно помочь вам начать работу

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