Я работаю с набором данных, в котором я хочу извлечь определенную подстроку из последовательности.
Один из моих столбцов содержит индексы символов в последовательности, на которые имеются ссылки (например) [45,45,D]
, означающие, что символ на 45-й позиции принадлежит классу D, и указывает, что символы в позициях с 1 по 44 не являются ссылки, и поэтому я удалил их.
После удаления символов в этих позициях я хочу обновить числа в этом столбце, чтобы указать (например) [1,1,D]
, поскольку теперь 45-я позиция теперь ссылается на первую позицию.
Я нахожу это трудным, как, например, для другой последовательности, [84,115,S]
Так что символы в позициях с 84 по 115 принадлежат классу S. Следующая пара значений - [151, 152, 'C']
Следовательно, символы в позициях от 116 до 150 были удалены, и [151, 152, 'C']
должен быть обновлен до [116, 117,S]
. Последующие числа в списке также должны быть обновлены (т. Е.) Следующим числом будет [118, ..] вместо [153, ...].
Я предоставил образец исходной последовательности, сокращенная последовательность и ссылочные позиции символов.
1016 *
Оригинальный Sequence : MSEVTRSLLQRWGASLRRGADFDSWGQLVEAIDEYQILARHLQKEAQAQHNNSEFTEEQKKTIGKIATCLELRSAALQSTQSQEEFKLEDLKKLEPILKNILTYNKEFPFDVQPIPLRRILAPGEEENLEFEEDEEGGAGAGPPDSFSARVPGTLLPRLPSEPGMTLLTIRIEKIGLKDAGQCIDPYITVSVKDLNGIDLTPVQDTPVASRKEDTYVHFNVDIELQKHVERLTKGAAIFFEFKHYKPKKRFTSTKCFAFMEMDEIKPGPIVIELYKKPTDFKRKKLQLLTKKPLYLHLHQSLHKE 1020 *
Укороченный последовательность : позиции MSEVTRSLLQRWGASLRRGADFDSWGQLVEAIDEYQILARHLQKEAQAQHNNSEFTEEQKKTIGKIATCLELRSAALQSTQSQEEFKLEDLKKLEPILKNILTYNKEFPFDVQPIVPGTLLPRLPSEPGMTLLTIRIEKIGLKDAGQCIDPYITVSVKDLNGIDLTPVQDTPVASRKEDTYVHFNVDIELQKHVERLTKGAAIFFEFKHYKPKKRFTSTKCFAFMEMDEIKPGPIVIELYKKPTDFKRKKLQLLTKKPLYLHLHQSLHKE 1024 *
ссылочные символов :
[[1, 3, 'C'], [4, 48, 'S'], [49, 54, 'C'], [55, 79, 'S'], [80, 83, 'C'], [84, 115, 'S'], [151, 152, 'C'], [153, 304, 'S'], [305, 305, 'D']]
Мой текущий подход заключается в следующем:
Глядя на две записи: [84, 115, 'S']
и [151, 152, 'C']
Скажи: A = 115 и B = 151. Разница между этими двумя числами 36, поэтому, если я вычту 35 из каждого из последующих чисел после 151, это даст мне правильное позиционирование класса: т.е. [116, 117, 'C']. Мне нужно сделать это для каждого места, где некоторые последовательности были удалены.
Таким образом, я сравниваю каждое 2-е число в первом [] с первым номером следующего [], и если эта разница> 1, то индекс должен быть обновлен.
У меня также есть случай, когда часть последовательности также удаляется из начала последовательности.
Я попытался сделать это следующим образом:
Где "shorttenlist1" - это список списков, которые содержат числа, относящиеся к позициям символов: (то есть) [[45, 45, 46, 49, 50, 66, 67, 101, 102, 103, 104, 106, 107, 108, 109, 120, 121, 121, 122, 123, 124, 140, 141, 149, 150, 176, 177, 178, 179, 181, 182, 194, 195, 213, 214, 217], [1, 1, 2, 143, 144, 145], [1, 145], [24, 29, 30, 91, 92, 92], [22, 24, 25, 38, 39, 55, 56, 348]...
mylist = []
i=0
j=0
for sublist in shortened_list1:
while j < len(shortened_list1):
A = sublist[0]
Y = sublist[i+1]
Z = sublist[j+2]
if A != 0:
sublist = [x - (A-1) for x in sublist]
mylist.append(sublist)
elif (Z-Y) >1:
sublist = [x - (Z-Y-1) for x in sublist]
mylist.append(sublist)
mylist
Возвращает правильный результат для первого подсписка. Но не работает для последующих подсписков или для случаев, когда часть последовательности была удалена из середины.