Изменение индекса в списке - PullRequest
0 голосов
/ 30 октября 2019

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

string_sequence = 'MLSPDLPDSAWNTRLLCRVMLCLLGAGSVAAGVIQSPRHLIKEKRETATLKCYPIPRHDTVYWYQQGPGQDPQFLISFYEKMQSDKGSIPDRFSAQQFSDYHSELNMSSLELGDSALYFCASSL'

На следующем шаге мне пришлось переварить эту аминокислотную последовательность с помощью фермента типсина, который отделяет последовательность отСтрока K и R, но если есть P, его нет.
На выходе выводятся нужные мне пептиды, которые сохраняются в типе списка и выглядят следующим образом:

list_sequence =    ['MLSPDLPDSAWNTR', 'LLCR', 'VMLCLLGAGSVAAGVIQSPR', 'HLIK', 'EK', 'R', 'ETATLK', 'CYPIPR', 'HDTVYWYQQGPGQDPQFLISFYEK', 'MQSDK', 'GSIPDR', 'FSAQQFSDYHSELNMSSLELGDSALYFCASSL']

сейчасУ меня проблема с моими индексами, которые я могу найти в своей базе данных.
В аминокислотной последовательности находится на 18-й позиции a V.
Я должен теперь найти в той же самой позиции в моем списке-datatype V.
Я мог бы найти это, посчитав аминокислоты вручную, но при длине последовательности 1000 аминокислот это может быть проблемой.

Теперь моя мысль такова:
Я знаю, что индекс каждого list_sequence[i] начинается с 0.

Есть ли способ, где я могу сказать в своем коде, чтоиндекс в list_sequence[1] начинается с len(list_sequence[0]), а индекс list_sequence[2] начинается с 18. Итак, следующий номер после последнего положения списка_последовательности-индекса.

Спасибо за ваш вклад!

Ответы [ 2 ]

0 голосов
/ 30 октября 2019

Вы можете справиться с этим, создав класс, который выполняет сопоставление индексов для вас:

class sequence:
    def __init__(self, seq):
        self.amino_seq=seq
        self.__split__sequence__()

    def __split__sequence__(self):
        #self.peptides =list()
        self.peptides_offset = list()
        count = 0
        for i in range(0, len(self.amino_seq)):
            if self.amino_seq[i]=='K' or self.amino_seq[i]=='R':
                #self.peptides.append(self.amino_seq[count:i+1])
                self.peptides_offset.append(count)
                count = i+1
        #self.peptides.append(self.amino_seq[count:len(self.amino_seq)])
        self.peptides_offset.append(len(self.amino_seq))

    def __getitem__(self, i):
        return self.amino_seq[i]

    def peptide(self, i):
        return self.amino_seq[self.peptides_offset[i]:self.peptides_offset[ i + 1]]

    def peptide_amino(self, tup):
        if tup[1]<0:
            return self.amino_seq[self.peptides_offset[tup[0]]]
        else:
            return self.amino_seq[self.peptides_offset[tup[0]] + tup[1]]

    def peptide_offset(self, tup):
        if tup[1]<0:
            return self.peptides_offset[tup[0]]
        else:
            return self.peptides_offset[tup[0]] + tup[1]

    def get_peptide_tuple(self, i):
        count=0
        for j in self.peptides_offset:
            if j>=i:
                return (count, i-j)
            count = count+1
        return (-1,-1)

    def get_number_of_peptides(self):
        return len(self.peptides_offset)-1

Затем вы можете использовать его следующим образом:

for i in range(0,seq.get_number_of_peptides()):
    print seq.peptide(i)

print seq[18]
print seq.peptide_amino((2,0))
print seq.peptide_offset((2,0))
print seq[seq.peptide_offset((2,0))]
print seq.get_peptide_tuple(18)
print seq[seq.peptide_offset(seq.get_peptide_tuple(18))]

, который выводит

MLSPDLPDSAWNTR
LLCR
VMLCLLGAGSVAAGVIQSPR
HLIK
EK
R
ETATLK CYPIPR
HDTVYWYQQGPGQDPQFLFF * * * * * * *
V
18
V
(2, 0)
V

Плюсом также является то, что class также сохраняет только последовательность и отображение смещенияно никогда не расщепляйте последовательность пептидов.

0 голосов
/ 30 октября 2019

Нет, ты не можешь. Возможно, самый читаемый способ сделать что-либо, как вы хотите, - это сохранить размер каждой последовательности, связанной с самой последовательностью, или также кумулятивное увеличение размера.

list_sequence =    ['MLSPDLPDSAWNTR', 'LLCR', 'VMLCLLGAGSVAAGVIQSPR', 'HLIK', 'EK', 'R', 'ETATLK', 'CYPIPR', 'HDTVYWYQQGPGQDPQFLISFYEK', 'MQSDK', 'GSIPDR', 'FSAQQFSDYHSELNMSSLELGDSALYFCASSL']

cumulative = 0
for idx, item in enumerate(list_sequence):
  len_item = len(item)
  list_sequence[idx] = (item, len_item, cumulative)
  cumulative += len_item

print(list_sequence) 

Вывод (первый элемент каждого списка - это ваша подпоследовательность, секунда - его длина, третья - начальный идентификатор подпоследовательности в вашей начальной полной последовательности)

[('MLSPDLPDSAWNTR', 14, 0), ('LLCR', 4, 14), ('VMLCLLGAGSVAAGVIQSPR', 20, 18), ('HLIK', 4, 38), ('EK', 2, 42), ('R', 1, 44), ('ETATLK', 6, 45), ('CYPIPR', 6, 51), ('HDTVYWYQQGPGQDPQFLISFYEK', 24, 57), ('MQSDK', 5, 81), ('GSIPDR', 6, 86), ('FSAQQFSDYHSELNMSSLELGDSALYFCASSL', 32,92)]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...