Обновление значений на основе удаленных символов из строки - PullRequest
1 голос
/ 12 января 2020

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

Один из моих столбцов содержит индексы символов в последовательности, на которые имеются ссылки (например) [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

Возвращает правильный результат для первого подсписка. Но не работает для последующих подсписков или для случаев, когда часть последовательности была удалена из середины.

Ответы [ 2 ]

1 голос
/ 12 января 2020

Если я правильно понял вопрос, это должно извлечь правильную подпоследовательность и обновить интервалы.

seq = "MSEVTRSLLQRWGASLRRGADFDSWGQLVEAIDEYQILARHLQKEAQAQHNNSEFTEEQKKTIGKIATCLELRSAALQSTQSQEEFKLEDLKKLEPILKNILTYNKEFPFDVQPIPLRRILAPGEEENLEFEEDEEGGAGAGPPDSFSARVPGTLLPRLPSEPGMTLLTIRIEKIGLKDAGQCIDPYITVSVKDLNGIDLTPVQDTPVASRKEDTYVHFNVDIELQKHVERLTKGAAIFFEFKHYKPKKRFTSTKCFAFMEMDEIKPGPIVIELYKKPTDFKRKKLQLLTKKPLYLHLHQSLHKE"

intervals = [[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']]

substrings = []

for i in intervals:
    #Takes the substring between the ranges
    substrings.append( seq[i[0]-1 : i[1]] )

final = ""
#Concatinates all of the substrings
for s in substrings:
    final += s

curInd = 1
#Adjusts the intervals
for i in range(len(intervals)):
    section = intervals[i]
    if section[0] != curInd: #If the interval is not correct
        dif = section[0] - curInd
        section[0]-=dif #Adjusts both sides
        section[1]-=dif
    curInd = section[1]+1 #update current ind

Отсюда вы должны получить извлеченную подстроку как final

0 голосов
/ 12 января 2020

Вы можете использовать 'cumsum' и 'shift':

df=pd.DataFrame([[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']],columns=["start","stop","cls"])

    start  stop cls
0      1     3   C
1      4    48   S
2     49    54   C
3     55    79   S
4     80    83   C
5     84   115   S
6    151   152   C
7    153   304   S
8    305   305   D

df["length"]=df.stop.sub(df.start).add(1)
df["new_start"]=df.length.cumsum().shift(fill_value=0)
df["new_stop"]=df.new_start.add(df.length).sub(1)

rslt= df.reindex(columns=["new_start","new_stop","cls"]).agg(list,axis=1).to_list()

[[0, 2, 'C'],
 [3, 47, 'S'],
 [48, 53, 'C'],
 [54, 78, 'S'],
 [79, 82, 'C'],
 [83, 114, 'S'],
 [115, 116, 'C'],
 [117, 268, 'S'],
 [269, 269, 'D']]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...