我正在处理一个数据集,我想从序列中提取某个子字符串。
我的一列包含序列中被引用的字符的索引(例如)[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,...]。
我提供了原始序列、缩短的序列和引用的字符位置的样本。
原始序列:MSEVTRSLLQRWGASLRRGADFDSWGQLVEAIDEYQILARHLQKEAQAQHNNSEFTEEQKKTIGKIATCLELRSAALQSTQSQEEFKLEDLKKLEPILKNILTYNKEFPFDVQPIPLRRILAPGEEENLEFEEDEEGGAGAGPPDSFSARVPGTLLPRLPSEPGMTLLTIRIEKIGLKDAGQCIDPYITVS VKDLNGIDLTPVQDTPVASRKEDTYVHFNVDIELQKHVERLTKGAAIFFEFKHYKPKKRFTSTKCFAFMEMDEIKPGPIVIELYKKPTDFKRKKLQLLTKKPLYLHLHQSLHKE
缩短序列:MSEVTRSLLQRWGASLRRGADFDSWGQLVEAIDEYQILARHLQKEAQAQHNNSEFTEEQKKTIGKIATCLELRSAALQSTQSQEEFKLEDLKKLEPILKNILTYNKEFPFDVQPIVPGTLLPRLPSEPGMTLLTIRIEKIGLKDAGQCIDPYITVSVKDLNGIDLTPVQDTPVASRKEDTYV HFNVDIELQKHVERLTKGAAIFFEFKHYKPKKRFTSTKCFAFMEMDEIKPGPIVIELYKKPTDFKRKKLQLLTKKPLYLHLHQSLHKE
引用的字符位置:[[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,因此如果我从 151 之后的每个后续数字中减去 35,它将给出该类的正确定位:即 [116, 117, ‘C’]。我需要对某些序列被删除的每个地方执行此操作。
因此,我将第一个 [] 中的每个第二个数字与下一个 [] 中的第一个数字进行比较,如果此差异 > 1,则必须更新索引。
我也遇到过从序列开头删除部分序列的情况。
我已经尝试过这样做,如下所示:
其中“shortenedlist1”是包含引用字符位置的数字的列表:(即)[[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、2 14、 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
这将返回第一个子列表的正确结果。但不适用于后续子列表,或者不适用于序列部分已从中间删除的情况。
最佳答案
如果我正确理解了问题,这应该提取正确的子序列并更新间隔。
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
关于python - 根据从字符串中删除的字符更新值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59701233/