2016-06-02 5 views
0

У меня есть небольшой набор данных, который я использую для получения результатов глобального выравнивания с помощью парного модуля BioPython. Я получил до сих пор, чтобы получить выравнивание и оценки результатов, а теперь у меня есть вопросы о структуре результатов и как я могу разобрать ихнепонятная структура данных python и parse python

ниже мой код:

import pandas as pd 
from Bio import pairwise2 
from Bio.SubsMat import MatrixInfo as matlist 

matrix = matlist.blosum62 
match = 5 
mismatch = -4 
gap_open = -10 
gap_extend = -0.5 


df = {'ID': ['H576','H577','H578'], 
    'CD': ['GCACGCATAAGTAGT', 'GCGAGGGGGGCTTC', 'GCGAGAGATCGGG']} 


df = pd.DataFrame(df) 


dictionary = df.set_index('ID')['CD'].to_dict() 

seq = dictionary.get('H576') 

for seq0 in df.CD: 
     alns = pairwise2.align.globalms(seq, seq0, match, mismatch, gap_open, gap_extend) 
     print(alns) 

результатов :

[('GCACGCATAAGTAGT', 'GCACGCATAAGTAGT', 75, 0, 15)] 

[('GCACGCATAAGTAGT-----', 'GCG------AGGGGGGCTTC', -15.5, 0, 20), ('GCACGCATAAGTAGT-----', 'GC------GAGGGGGGCTTC', -15.5, 0, 20)], ....] 

[('GCA------CGCATAAGTAGT', 'GCGAGAGATCG--------GG', -9.0, 0, 21), ('GC------ACGCATAAGTAGT', 'GCGAGAGATCG--------GG', -9.0, 0, 21)]GGGGGC--------TTCAGAGAGTTATAGGCTGTTTGACTAC', 'GTGAGAGATGCGCCGCGTATTC---GA-----AGCTTCTTTGACTAC', 55.5, 0, 47)],....] 

мои вопросы:

Очевидно, что результаты содержат 3 основных набора, но какая структура данных является результатом выше? наборы? кортежи? наборы и кортежи?

Я хотел бы только посмотреть на первый набор элементов из каждого набора:

('GCACGCATAAGTAGT', 'GCACGCATAAGTAGT', 75, 0, 15) 

('GCACGCATAAGTAGT-----', 'GCG------AGGGGGGCTTC', -15.5, 0, 20) 

('GCA------CGCATAAGTAGT', 'GCGAGAGATCG--------GG', -9.0, 0, 21) 

затем в цикле, назначить первую последовательность каждого набора, чтобы быть seq0 и второй последовательности каждый след быть seq1, а затем я собираюсь сделать что-то с ними:

так для первого набора:

seq0 = 'GCACGCATAAGTAGT' 
seq1 = 'GCACGCATAAGTAGT' 

второй комплект:

seq0 = 'GCACGCATAAGTAGT-----' 
seq1 = 'GCG------AGGGGGGCTTC' 

третий комплект:

seq0 = 'GCA------CGCATAAGTAGT' 
seq1 = 'GCGAGAGATCG--------GG' 
+0

Обратите внимание, что блок «результаты» невозможен с заданным сценарием, независимо от того, какой ввод. Я предполагаю, что вы его отредактировали, и было бы проще не редактировать или действительно удалять неинтересные части, а не вставлять эллипсис, так как люди, желающие понять проблему и дающие соответствующие ответы, все должны исправить это, если они хотят доставить рабочий прототип включая тестовые данные, как я сделал в своем ответе ;-) – Dilettant

ответ

2

Мне кажется, что это списки кортежей.

[] означает, что лист

() означает кортеж (только для чтения список)

Самый простой способ добиться того, что вы просите, чтобы индексировать элементы из списка, как так:

# Renamed seq0 so it doesn't interfere with below variable 
for sequence0 in df.CD: 
    alns = pairwise2.align.globalms(seq, sequence0, match, mismatch, gap_open, gap_extend) 
    # This is how you would get the first group of items from each tuple 
    first_group_of_items = alns[0] 

    # Now to get the seq variables you asked for 
    # Since this variable is seq0, the above seq0 was renamed 
    seq0 = first_group_of_items[0] 
    seq1 = first_group_of_items[1] 

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

1

В вашем случае у вас есть список кортежей.

Для доступа к первому элементу каждого списка вы можете просто сделать:

list[0] 

Поскольку список содержит кортежи он возвращает полный кортеж.

Тогда, как только вы получите ваш кортеж вы можете сделать первые два значения, как:

seq0 = tuple[0] 
seq1 = tuple[1] 

Если вы не хотите хранить промежуточное значение, которое можно непосредственно сделать:

seq0 = list[0][0] 
seq1 = list[0][1] 

I надеюсь, что это помогло. Хорошего дня.

Чтобы добавить к примеру:

In [16]: A = [('GCACGCATAAGTAGT', 'GCACGCATAAGTAGT', 75, 0, 15)] 

In [17]: A[0] 
Out[17]: ('GCACGCATAAGTAGT', 'GCACGCATAAGTAGT', 75, 0, 15) 

In [18]: A[0][0] 
Out[18]: 'GCACGCATAAGTAGT' 

In [19]: A[0][1] 
Out[19]: 'GCACGCATAAGTAGT' 
1

Посмотрите, как list[] из tuples().

Если вы уверены, что вы хотите сохранить первое, сохранить первое:

sequences = [] 
for seq0 in df.CD: 
    alns = pairwise2.align.globalms(seq, seq0, match, mismatch, gap_open, gap_extend) 
    sequences.append(alns[0]) 

Таким образом, вы получите:

sequences == [('GCACGCATAAGTAGT', 'GCACGCATAAGTAGT', 75, 0, 15), 
       ('GCACGCATAAGTAGT-----', 'GCG------AGGGGGGCTTC', -15.5, 0, 20), 
       ('GCA------CGCATAAGTAGT', 'GCGAGAGATCG--------GG', -9.0, 0, 21)] 

Какой то, что вам нужно, то сделать что-то с ними, просто перебирать список:

for seq1, seq2, *rest in sequences: 
    # Do the job with seq1 and seq2... 

Если вы заботитесь о трех значений (и знать, что они означают), вы должны назовите их правильно, а не как я:

for seq1, seq2, name, this, properly in sequences: 
    # Do the job with seq1, seq2, name, this, and properly. 
1

Если вы действительно хотите, чтобы они хранятся в переменных, названных seq0 и seq1 (и мы будем игнорировать недопустимое отображение выборки в alns контенте/выводе из вашей программы в вопросе:

#! /usr/bin/env python 
from __future__ import print_function 

alns_seq = (
    [('GCACGCATAAGTAGT', 'GCACGCATAAGTAGT', 75, 0, 15)], 
    [('GCACGCATAAGTAGT-----', 'GCG------AGGGGGGCTTC', -15.5, 0, 20), 
    ('GCACGCATAAGTAGT-----', 'GC------GAGGGGGGCTTC', -15.5, 0, 20)], 
    [('GCA------CGCATAAGTAGT', 'GCGAGAGATCG--------GG', -9.0, 0, 21), 
    ('GC------ACGCATAAGTAGT', 'GCGAGAGATCG--------GG', -9.0, 0, 21)] 
) 

for i, alns in enumerate(alns_seq, start=1): 
    seq0, seq1 = alns[0][:2] 
    print("Set No. %d:" % (i,)) 
    print(" seq0 = '%s'" % (seq0,)) 
    print(" seq1 = '%s'" % (seq1,)) 

урожайность:

Set No. 1: 
seq0 = 'GCACGCATAAGTAGT' 
seq1 = 'GCACGCATAAGTAGT' 
Set No. 2: 
seq0 = 'GCACGCATAAGTAGT-----' 
seq1 = 'GCG------AGGGGGGCTTC' 
Set No. 3: 
seq0 = 'GCA------CGCATAAGTAGT' 
seq1 = 'GCGAGAGATCG--------GG' 

Это должно ответить на ваш вышеуказанный вопрос и выполнить указанные требования.

Некоторые улучшения возможны, и вы можете запросить их в любое время ;-)