2016-12-16 2 views
1

Я изучаю python и пытаюсь работать на карте и кортеже. Я создал словарь из проанализированного файла и разбираюсь в другом файле. Я хочу, чтобы перебрать словарь и заменить первый элемент каждой строки разбираемого файла с идентификатором, полученным из словаряИтерация по словарю при создании кортежа

моего словарь:

for line in blast_lines: 
    (transcript,swissProt,identity) = parse_blast(blast_line=line) 
    transcript_to_protein[transcript] = swissProt 

Синтаксических в файле, а также создание кортежа что будет иметь значение из словаря в качестве первого элемента, если запись существует для этого ID

def parse_matrix(matrix_line): 
    matrixFields = matrix_line.rstrip("\n").split("\t") 
    protein = matrixFields[0] 
    if matrixFields[0] in transcript_to_protein: 
      protein = transcript_to_protein.get(transcript) 
      matrixFields[0] = protein 
    return(tuple(matrixFields)) 

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

Входы:

взрыва (то, что в настоящее время хранится в словаре)

c1000_g1_i1|m.799 gi|48474761|sp|O94288.1|NOC3_SCHPO 100.00 747 0 0 5 751 1 747 0.0 1506 

для этой линии расшифровка c1000_g1_i1, швейцарская Prot является O94288.1

матрица (файл является разобранный)

c3833_g1_i2 4.00 0.07 16.84 26.37 

Я пытаюсь заменить это первое поле (matrixFi elds [0]) с swissProt из словаря, если значение в первом поле соответствует ключу (расшифровке) из словаря.

Я хочу, чтобы выходной сигнал, который выглядит, как этот

Q09748.1 4.00 0.07 16.84 26.37 
O60164.1 24.55 116.87 220.53 28.82 
C5161_G1_I1 107.49 89.39 26.95 698.97 
P36614.1 27.91 72.57 5.56 36.58 
P37818.1 82.57 19.03 48.55 258.22 

Но я получаю это:

O94423.1 4.00 0.07 16.84 26.37 
O94423.1 24.55 116.87 220.53 28.82 
C5161_G1_I1 107.49 89.39 26.95 698.97 
O94423.1 27.91 72.57 5.56 36.58 
O94423.1 82.57 19.03 48.55 258.22 

Обратите внимание, как 4 из них все имеют одинаковое значение, а не отдельных транскриптов из словаря

Полный код:

transcript_to_protein = {}; 

def parse_blast(blast_line="NA"): 
    fields = blast_line.rstrip("\n").split("\t") 
    queryIdString = fields[0] 
    subjectIdString = fields[1] 
    identity = fields[2] 
    queryIds = queryIdString.split("|") 
    subjectIds = subjectIdString.split("|") 
    transcript = queryIds[0].upper() 
    swissProt = subjectIds[3] 
    base = swissProt.split(".")[0] 
    return(transcript, swissProt, identity) 

blast_output = open("/scratch/RNASeq/blastp.outfmt6") 
blast_lines = blast_output.readlines() 

for line in blast_lines: 
    (transcript,swissProt,identity) = parse_blast(blast_line=line) 
    transcript_to_protein[transcript] = swissProt 

def parse_matrix(matrix_line): 
    matrixFields = matrix_line.rstrip("\n").split("\t") 
    matrixFields[0] = matrixFields[0].upper() 
    protein = matrixFields[0] 
    if matrixFields[0] in transcript_to_protein: 
      protein = transcript_to_protein.get(transcript) 
      matrixFields[0] = protein 
    return(tuple(matrixFields)) 

def tuple_to_tab_sep(one_tuple): 
    tab = "\t" 
    return tab.join(one_tuple) 

matrix = open("/scratch/RNASeq/diffExpr.P1e-3_C2.matrix") 

newline = "\n" 

list_of_de_tuples = map(parse_matrix,matrix.readlines()) 

list_of_tab_sep_lines = map(tuple_to_tab_sep, list_of_de_tuples) 
print(newline.join(list_of_tab_sep_lines)) 

ответ

2

Сначала есть ошибка в parse_blast() -it не возвращает кортеж (transcript,swissProt,identity), вместо этого он возвращается (transcript,base,identity) и base не содержит недостающую информацию.

Update

Во-вторых, есть также ошибка в parse_matrix(). Первое поле, прочитанное из файла, не содержит недостающей информации, однако это то, что он помещает в кортеж, который возвращается, когда matrixFields[0] находится в словаре transcript_to_protein.

Простое исправление не решит проблему самостоятельно.

+0

При этом скорректированным он по-прежнему печатями одинакового значения для всех замененных полей вместо перебора словаря, вместо распечатки последнего значения для всех из них –

0

Кажется, проблема может быть в функции парсебласта. Для линии

c1000_g1_i1|m.799 gi|48474761|sp|O94288.1|NOC3_SCHPO 100.00 747 0 0 5 751 1 747 0.0 1506 

subjectIdString = fields[1] 

Так subjectIdString бы ГИ | 48474761 | зр | O94288.1 | NOC3_SCHPO

А потом

swissProt = subjectIds[3] 

Swissprot будет O94288.1, где функция дальнейшие расколы, используя. на линии

base = swissProt.split(".")[0] 

Конечным результатом будет то, что SwissProt будет 094288, а не | O94288.1, что кажется, что вы ожидаете. Я бы рекомендовал протестировать эту функцию на однострочном вводе до получения желаемого результата

+0

It отлично работает для одной строки, проблема в том, что он просто печатает один и тот же идентификатор swissprot для всех строк, а не те, которые соответствуют ключу в словаре –

0

Ошибка была в моем словаре, потому что я хотел сопоставить matrixFields [0] с расшифровкой из словаря, я пытался найти словарь с использованием if matrixFields[0] in transcript_to_protein:, но вместо этого, необходимых для назначения поля

trasncript = matrixfields[0] 
if transcript in transcript_to_protein: 
     protein = transcript_to_protein.get(transcript) 
Смежные вопросы