python - 根据从字符串中删除的字符更新值

标签 python string pandas list

我正在处理一个数据集,我想从序列中提取某个子字符串。

我的一列包含序列中被引用的字符的索引(例如)[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/

相关文章:

python - 用于在 Python 中将长字符串写入文件的干净代码

python - 如何检查元素是否是 Pandas 中的空列表?

python - 协议(protocol)实现类类型检查

python - pygame中有popMatrix、pushMatrix、Translate吗?

c - 评估存储在变量中的字符串并分配给数组

python - 在 Python 中将字符串转换为列表

python - 如何删除 Pandas 中的配对重复?

python - 查找 DataFrame 的两个字符串列之间的相似性

python - Django查询多次出现的外来对象

python - 当它应该返回 Series 时应用返回 DataFrame