Python IndexError: строка вне диапазона

avatar
kwhk
8 апреля 2018 в 06:50
65
1
-4

Привет, я начинаю изучать Python и столкнулся с проблемой. Вот фрагмент моей функции:

for i in range(0,len(list(string))):
    if string[i] in punctuation:
        if i == len(list(string))-1:
             new_string += string[i]
        if string[i+1] or string[i-1] == ' ':
            continue
        elif string[i+1] or string[i-1] in punctuation:
            continue
        else:
            new_string += string[i]

    elif string[i] in numbers:
        new_string += ' '

    else:
        new_string += string[i]

Этот сегмент предназначен для получения строки и возврата new_string, который удаляет все знаки препинания, но не знаки препинания, находящиеся между буквами, такие как апострофы (например, jacob's) или дефисы (например, давно установленные). Однако я получаю сообщение об ошибке:

if doc[i+1] or doc[i-1] == ' ':
IndexError: string index out of range

Я думал, что строка 3 в моем коде предотвратит появление этой ошибки, и я не вижу, что не так. При этом мой код слишком неэффективен?

Спасибо!

Источник
user2357112 supports Monica
8 апреля 2018 в 06:51
0

if не elif. Голосование за закрытие как опечатка.

user2357112 supports Monica
8 апреля 2018 в 06:53
0

@RahulBharadwaj: У вас есть другая проблема, которую вы ошибочно обвинили в исчезновении elif. Это не исчезло.

harmands
8 апреля 2018 в 06:56
0

@RahulBharadwaj docs.python.org/3/tutorial/controlflow.html#if-statements

DYZ
8 апреля 2018 в 07:06
0

if string[i+1] or string[i-1] == ' ': должно быть if string[i+1]==' ' or string[i-1] == ' ':.

kwhk
8 апреля 2018 в 07:17
0

@ user2357112 спасибо за исправление. Я тестирую свой код со строкой типа «abc-def», в которой дефис должен присутствовать в new_string, однако он возвращает «abcdef», почему это?

pask
8 апреля 2018 в 07:27
0

doc[i-1] это будет относиться к последнему элементу, если i==0. У строки есть len, поэтому вам не нужно приводить ее к списку. len(string)

Artemis
8 апреля 2018 в 08:09
0

Когда i имеет окончательное значение, конечно, [i+1] выходит за пределы допустимого диапазона.

Ответы (1)

avatar
user9611000
8 апреля 2018 в 13:38
0

Чтобы избежать ошибки IndexError, иногда может быть проще просто адаптировать диапазон, например так:

from string import punctuation as punct

def remove_punctuation(old_string):
    """Remove punctuation from "string" if not between 2 letters."""
    new_string =''
    s = ' ' + old_string + ' '
    for i in range(1, len(s) - 1):
        if s[i] in punct and (not s[i - 1].isalpha() or not s[i + 1].isalpha()):
            continue
        else:
            new_string += s[i]
    return new_string