Удаление букв в строке в позициях, которые не соответствуют номерам в диапазоне в списке Python - PullRequest
1 голос
/ 25 октября 2019

У меня есть список диапазонов чисел, т.е. [[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']].

У меня есть последовательность символов:

"MSEVTRSLLQRWGASLRRGADFDSWGQLVEAIDEYQILARHLQKEAQAQHNNSEFTEEQKKTIGKIATCLELRSAALQSTQSQEEFKLEDLKKLEPILKNILTYNKEFPFDVQPIPLRRILAPGEEENLEFEEDEEGGAGAGPPDSFSARVPGTLLPRLPSEPGMTLLTIRIEKIGLKDAGQCIDPYITVSVKDLNGIDLTPVQDTPVASRKEDTYVHFNVDIELQKHVERLTKGAAIFFEFKHYKPKKRFTSTKCFAFMEMDEIKPGPIVIELYKKPTDFKRKKLQLLTKKPLYLHLHQSLHKE"

, и цифры в списке соответствуютна позиции персонажей.

т.е. [1,3,'C'] означает, что символы MSE (символы в позиции 1-3) являются C.

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

Другой пример, когда у меня есть диапазон чисел: [[45, 45, 'D'], [46, 49, 'C'], [50, 66, 'S'], [67, 101, 'C'], [102, 103, 'S'], [104, 106, 'C'], [107, 108, 'S'], [109, 120, 'C'], [121, 121, 'S'], [122, 123, 'C'], [124, 140, 'S'], [141, 149, 'C'], [150, 176, 'S'], [177, 178, 'C'], [179, 181, 'S'], [182, 194, 'C'], [195, 213, 'S'], [214, 217, 'C']]

Этот примерсоответствует строке длиной 310, и мы можем видеть, что символы в позиции 0-45 не упоминаются, равно как и символы из 218-310, поэтому я бы тоже хотел их удалить.

У меня проблемы с созданием функции, которая исправляет эти три случая удаления, поскольку иногда только один из случаев является истинным, или ни один из них не является истинным.

Я извлек цифры из последовательности в список и изменил индекс, поскольку строковый индекс начинается с 0:

[44, 44, 45, 48, 49, 65, 66, 100, 101, 102, 103, 105, 106, 107, 108, 119, 120, 120, 121, 122, 123, 139, 140, 148, 149, 175, 176, 177, 178, 180, 181, 193, 194, 212, 213, 216]

, и мой текущий мыслительный процесс:

1) Если первое число в списке! = 0, удалить из соответствующего символа от 0 до элемента в первой позиции - т.е. удалить от 0 до 45 в примере 2.

2) Если разница междукаждый 2-й и 3-й элемент! = 1, т. е. если в середине чисел есть пробел, то удалите буквы, соответствующие указанным элементам. то есть удалить 116-150, упомянутых выше в примере 1.

Я делаю это, разбивая строку на 0-116 и 150 до конца списка, а затем объединяя строки.

3) Если последнее число в списке не является последним символом в строке, удалите его из последнего символа, на который есть ссылки до конца строки.

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

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

x - список чисел, strSeq - строка

copyx = x
x[0]=0

veryFirstElementOfX = int(x[0])
veryLastElementOfX = int(x[-1])

removed = 0
reeString = ''

if x[0] != 0:
    for i in range(0, x[0]):
        reeString = strSeq[x[0]:]
xMinusFirst = x
xMinusFirst.pop(0)
firstElement = int(x[0])
secondElement = int(x[1])

while secondElement != x[-1]:
    x.pop(0)
    x.pop(0)
    firstElement = int(x[0])
    secondElement = int(x[1])
    difference = secondElement - firstElement
    print("FE: " + str(firstElement))
    print("SE: " + str(secondElement))
    print(difference)
    print("\n")

    if difference > 1:
        firstString = strSeq[0:firstElement]
        secondString = strSeq[secondElement:]
        reeString = reeString + firstString + secondString
        removed = removed + (difference-1)

indexuno = veryFirstElementOfX
print(indexuno)
indexdos = veryLastElementOfX - removed
string1 = reeString[indexuno:indexdos]

Ожидается вывод сокращенной строки, только буквы соответствуют диапазонам чисел всписок. (т.е.) символы, на позицию которых нет ссылок, удалены.

Приведенный выше код работает с первым примером (т.е.), когда символы в позиции 116-150 должны быть удалены.

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

      7     x.pop(0)
      8     firstElement = int(x[0])
----> 9     secondElement = int(x[1])
     10     difference = secondElement - firstElement
     11     print("FE: " + str(firstElement))

IndexError: list index out of range

Ответы [ 2 ]

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

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

s = "MSEVTRSLLQRWGASLRRGADFDSWGQLVEAIDEYQILARHLQKEAQAQHNNSEFTEEQKKTIGKIATCLELRSAALQSTQSQEEFKLEDLKKLEPILKNILTYNKEFPFDVQPIPLRRILAPGEEENLEFEEDEEGGAGAGPPDSFSARVPGTLLPRLPSEPGMTLLTIRIEKIGLKDAGQCIDPYITVSVKDLNGIDLTPVQDTPVASRKEDTYVHFNVDIELQKHVERLTKGAAIFFEFKHYKPKKRFTSTKCFAFMEMDEIKPGPIVIELYKKPTDFKRKKLQLLTKKPLYLHLHQSLHKE"

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

new_s = ''

for item in L:
    new_s += s[item[0]-1:item[1]]



print(len(new_s), new_s)
0 голосов
/ 25 октября 2019

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

list_numbers = [
    [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"],
]

# Generate a list of all the numbers given.
numbers = set()
for obj in list_numbers:
    num1 = obj[0]
    num2 = obj[1]
    numbers.update(range(num1, num2 + 1))

# > {1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 151, 152, 153, 154, 155, 156, 157, 158, 159, 160, 161, 162, 163, 164, 165, 166, 167, 168, 169, 170, 171, 172, 173, 174, 175, 176, 177, 178, 179, 180, 181, 182, 183, 184, 185, 186, 187, 188, 189, 190, 191, 192, 193, 194, 195, 196, 197, 198, 199, 200, 201, 202, 203, 204, 205, 206, 207, 208, 209, 210, 211, 212, 213, 214, 215, 216, 217, 218, 219, 220, 221, 222, 223, 224, 225, 226, 227, 228, 229, 230, 231, 232, 233, 234, 235, 236, 237, 238, 239, 240, 241, 242, 243, 244, 245, 246, 247, 248, 249, 250, 251, 252, 253, 254, 255, 256, 257, 258, 259, 260, 261, 262, 263, 264, 265, 266, 267, 268, 269, 270, 271, 272, 273, 274, 275, 276, 277, 278, 279, 280, 281, 282, 283, 284, 285, 286, 287, 288, 289, 290, 291, 292, 293, 294, 295, 296, 297, 298, 299, 300, 301, 302, 303, 304, 305}
print(numbers)

# Retrieve the biggest number.
max_number = max(numbers)

# Generate a set from 0 to max_number.
all_numbers = set(i for i in range(max_number))

# > {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, 127, 128, 129, 130, 131, 132, 133, 134, 135, 136, 137, 138, 139, 140, 141, 142, 143, 144, 145, 146, 147, 148, 149, 150, 151, 152, 153, 154, 155, 156, 157, 158, 159, 160, 161, 162, 163, 164, 165, 166, 167, 168, 169, 170, 171, 172, 173, 174, 175, 176, 177, 178, 179, 180, 181, 182, 183, 184, 185, 186, 187, 188, 189, 190, 191, 192, 193, 194, 195, 196, 197, 198, 199, 200, 201, 202, 203, 204, 205, 206, 207, 208, 209, 210, 211, 212, 213, 214, 215, 216, 217, 218, 219, 220, 221, 222, 223, 224, 225, 226, 227, 228, 229, 230, 231, 232, 233, 234, 235, 236, 237, 238, 239, 240, 241, 242, 243, 244, 245, 246, 247, 248, 249, 250, 251, 252, 253, 254, 255, 256, 257, 258, 259, 260, 261, 262, 263, 264, 265, 266, 267, 268, 269, 270, 271, 272, 273, 274, 275, 276, 277, 278, 279, 280, 281, 282, 283, 284, 285, 286, 287, 288, 289, 290, 291, 292, 293, 294, 295, 296, 297, 298, 299, 300, 301, 302, 303, 304}
print(all_numbers)

# Subtract our current list minus the set.
missing_numbers = all_numbers - set(numbers)

# > {0, 128, 129, 130, 131, 132, 133, 134, 135, 136, 137, 138, 139, 140, 141, 142, 143, 144, 145, 146, 147, 148, 149, 150, 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, 127}
print(missing_numbers)

Если я правильно понял ваше приглашение, с помощью приведенного выше списка вы сможете удалить все индексы в строке, которая не упомянута.

...