Обработка строк в Python

#python #arrays #string

Вопрос:

Я пытаюсь написать короткую функцию python, чтобы разбить длинную строку one_line на многострочную строку путем вставки n . код отлично работает, когда я просто вставляю n в строку, но я получаю ошибку «индекс вне диапазона», когда я вставляю условную проверку для добавления переносов. Вот код, который я написал.

 Sentence = "Python string comparison is performed using the characters in both strings. The characters in both strings are compared one by one. When different characters are found then their Unicode value is compared. The character with lower Unicode value is considered to be smaller."
for i in range(1, int(len(Sentence)/40) 1):
    x = i*40
    Sentence = Sentence[:x]   "n" if Sentence[x] == " " else "-n"   Sentence[x:]
print(Sentence)
 

Вот сообщение об ошибке, которое я получаю.

 Traceback (most recent call last):
  File "/media/u1/data/prop.py", line 4, in <module>
    Sentence = Sentence[:x]   "n" if Sentence[x] == " " else "-n"   Sentence[x:]
IndexError: string index out of range
 

Комментарии:

1. range можно сделать шаг вперед аргументом: for x in range(40, len(Sentence), 40) . Это должно быть проще, чем пытаться манипулировать 2-м аргументом.

Ответ №1:

Условное выражение является жадным, анализируется так, как если бы вы написали

 Sentence = Sentence[:x]   
           ("n" if Sentence[x] == " " else "-n"   Sentence[x:])
 

В результате вы выполняете одну из двух операций:

  1. Sentence[:x] 'n' если вы найдете свободное место
  2. Sentence[:x] "-n" Sentence[x:] если вы найдете другого персонажа.

Обратите внимание, что случай 1 неправильно сокращает ваше предложение, но ваш range объект основан на исходном правильном списке.

Решение состоит в том, чтобы использовать круглые скобки для правильного определения условного выражения:

 for i in range(1, int(len(Sentence)/40) 1):
    x = i*40
    c = Sentence[x]
    Sentence = Sentence[:x]   (f"n" if c == " " else f"{c}-n")   Sentence[x 1:]
    #                         ^                                ^
 

Комментарии:

1. Это исправит ошибку, но я сомневаюсь, что измененный код даст желаемые результаты.

2. Я думаю, что это будет проанализировано как Sentence = (Sentence[:x] "n") if Sentence[x] == " " else ("-n" Sentence[x:]) ? проверено, с '3' '5' if 0 else '99 7' каким возвратом '99 7'

3. @SCKU Я думаю, что вы правы, потому что это выше, чем if-else в приоритете оператора Python .

4.Да, я действительно не проверял точный приоритет, только он Sentence становился короче по мере продвижения цикла. Я думаю, что основная проблема с измененным кодом заключается в том, что он заменяет Sentence[x] , -"n" а не вставляет дефис после Sentence[x] .

Ответ №2:

Ну, проблема может быть не очевидна с самого начала, но когда вы начнете смотреть на if оператор в середине объединения строк, вы поймете. На минуту просто сосредоточьтесь на следующей строке:

 Sentence = Sentence[:x]   "n" if Sentence[x] == " " else "-n"   Sentence[x:]
 

Python проанализировал бы это утверждение следующим образом:

 Sentence = (Sentence[:x]   "n") if Sentence[x] == " " else ("-n"   Sentence[x:])
 

Внимательно обратите внимание на скобки. Именно по этой причине длина строки, удерживаемой переменной Sentence , уменьшается после каждой итерации, которая вызывает IndexError исключение. Следовательно, чтобы решить эту проблему, нам придется явно сообщить Python, чего мы ожидаем. Итак, это можно было бы записать как таковое:

 Sentence = Sentence[:x]   ("n" if Sentence[x] == " " else "-n")   Sentence[x:]
 

Комментарии:

1. Почему python не анализирует оператор типа: Sentence = (Sentence[:x] "n") if Sentence[x] == " " else ("-n" Sentence[x:]) ?

2. @SCKU, я виноват. Ты прав. Я отредактирую его. Спасибо, что указали на это!

Ответ №3:

 string = "Python string comparison is performed using the characters in both strings. The characters in both strings are compared one by one. When different characters are found then their Unicode value is compared. The character with lower Unicode value is considered to be smaller."
stc = ""

for j in range(1   len(string) // 40):
    stc  = string[j * 40:40 * (j   1)]   "n"

print(stc)
 

Комментарии:

1. Я не думаю, что это подходит - для персонажа, хотя, верно?