дополнительное условие if (elif) не работает в цикле while - PullRequest
0 голосов
/ 03 апреля 2020

все! Я очень плохо знаком с Python и пытаюсь изучить некоторые основы. Я столкнулся с задачей при прохождении онлайн-курсов для начинающих. Задача состояла в том, чтобы создать программу, которая будет читать строку из нескольких букв, например, «aaabbb ccc», и выводить «a3b3c3» (другой пример: это может быть «abccaab», тогда программа должна вывести «a1b1c2a2b1» ). Я думал, что нашел способ справиться с этим, используя while l oop, но в конце, когда я добавляю elif-конструкцию в if else, это не работает: когда я ввожу свою строку и нажимаю enter, она просто проходит на следующую строку и кажется, что программа еще не началась. Я буду очень благодарен за любые комментарии или советы о том, как это исправить, или за любые альтернативные идеи, которые могут помочь решить задачу.

n = input()
i = 0
j = i + 1
s = 1
m = ''
while j < len(n):
    if j == len(n) - 1:
        s += 1
        m += n[j] + str(s)
    elif n[i] != n[j]:
        m += n[i] + str(s)
        i += 1
        j += 1
        s = 1
    else:
        i += 1
        j += 1
        s += 1
print(m)

Ответы [ 2 ]

2 голосов
/ 03 апреля 2020

Вам нужно всегда увеличивать j, иначе вы получите бесконечное l oop

while j < len(n):
    if j == len(n) - 1:
        s += 1
        m += n[j] + str(s)
    elif n[i] != n[j]:
        m += n[i] + str(s)
        i += 1
        s = 1
    else:
        i += 1
        s += 1
    j += 1

Вы можете избежать такого рода ошибок, используя циклы for (по своей природе они менее склонны к бесконечное поведение) например:

s = 1
m = ''
for i in range(len(n) - 1):
    j = i + 1
    if j == len(n) - 1:
        s += 1
        m += n[j] + str(s)
    elif n[i] != n[j]:
        m += n[i] + str(s)
        s = 1
    else:
        s += 1

print(m)

ps: я думаю, что у вас есть логика c проблема, связанная с последним символом

s = 1
m = ''
for i in range(len(n)):
    j = i + 1
    # handle last char
    if j >= len(n):
        if s > 1:
            # If the last char is the same as previous one
            m += n[i] + str(s)
        else:
            # if the last char is different
            m += n[i] + str(s)
    elif n[i] != n[j]:
        m += n[i] + str(s)
        s = 1
    else:
        s += 1
0 голосов
/ 03 апреля 2020

Ну, ответ на вашу проблему: «у вас есть бесконечное число oop». Почему?

Проверьте эту часть вашего кода:

if j == len(n) - 1:
    s += 1
    m += n[j] + str(s)

Как видите, этот блок внутри оператора if будет выполняться, когда j == len(n)-1 означает, что j ( вы используете для l oop через n достигнет последнего элемента в строке n. Таким образом, после этой строки j останется то же значение и больше ничего не будет выполняться, то есть условие j < len(n) будет будь True навсегда, следовательно, твой бесконечный l oop. Теперь у тебя есть варианты здесь:

- Вы можете добавить j+=1 внутри этого блока if.

if j == len(n) - 1:
    s += 1
    m += n[j] + str(s)
    j += 1

- Вы можете добавить j+=1 вне всех if блоков и удалить его из других if блоков

while j < len(n):
    if j == len(n) - 1:
        s += 1
        m += n[j] + str(s)
    elif n[i] != n[j]:
        m += n[i] + str(s)
        i += 1
        s = 1
    else:
        i += 1
        s += 1
    j += 1

Теперь есть некоторые проблемы логики c, касающиеся некоторых опций. Я проведу рефакторинг вашего кода и исправлю проблемы. Также я настоятельно рекомендую вам использовать значимые имена переменных. Это поможет другим и вам (в будущем) понять и отладить ваш код.

word = input() 
result = "" # This will hold the result string

# Will assume user did not input an empty string. You could check that though
currentLetter = word[0] # Get the first letter
currentCount = 1 # Count it as 1
j = 1 # To start from the index 1 and iterate over word letters

while(j < len(word)):
    if word[j] != currentLetter:
        # if the letter on the current index is different from the currentLetter
        # means there was a change so we must add to the result string what
        # we counted (letter and count)
        result += currentLetter + str(currentCount)

        # Get the new letter and set its count to 1
        currentLetter = word[j]
        currentCount = 1
    else:
        # Else the letter is the same so far -> increase count
        currentCount += 1
    j += 1 # Increase index variable
else:
    # This else will execute when the while condition is false
    # add the remaining values
    result += currentLetter + str(currentCount)

print(result)
...