Yelo
@Yelo
сам ни ни)

В чем проблема некорректного выполнения кода, почему-то символ пропускает???

Доброе время суток не могу понять почему при одной из итераций в цикле for пропускается символ и берется следующий хотя по идее должен быть 'c' а по факту 'a'. Задумка в том что передать строку как в данном случае
aaaabbcaa а результатом получить a4b2c1a2.

def run_in_letter(usr, letter):
    count = 0

    for i in usr:
        if i == letter:
            count += 1
        elif i != letter:
            return count


usr = list(input())
print("данные в списке после ввода", usr)
res_row = []
print("запуск основного цикла проход по буквам")
for letter in usr:
    print("список в начале ---------", usr)
    print("буква взятая цикло при первой итерации", letter)
    res_row.append(letter)
    print("список res_row при добавлении буквы", res_row)
    count = run_in_letter(usr, letter)
    print(f"результат с выполнения функции: {count}")

    res_row.append(count)

    print("\n запуск цикла for для удаления")
    for i in range(count):
        usr.pop(0)
    print("\n окончание цикла удаления")
    print("рузультат после удаления", usr)

print(res_row)

# ввод пользователя: aaaabbcaa


Вот результат из консоли:

aaaabbcaa
данные в списке после ввода ['a', 'a', 'a', 'a', 'b', 'b', 'c', 'a', 'a']
запуск основного цикла проход по буквам
список в начале --------- ['a', 'a', 'a', 'a', 'b', 'b', 'c', 'a', 'a']
буква взятая цикло при первой итерации a
список res_row при добавлении буквы ['a']
результат с выполнения функции: 4

запуск цикла for для удаления

окончание цикла удаления
рузультат после удаления ['b', 'b', 'c', 'a', 'a']
список в начале --------- ['b', 'b', 'c', 'a', 'a']
буква взятая цикло при первой итерации b
список res_row при добавлении буквы ['a', 4, 'b']
результат с выполнения функции: 2

запуск цикла for для удаления

окончание цикла удаления
рузультат после удаления ['c', 'a', 'a']
список в начале --------- ['c', 'a', 'a']
буква взятая цикло при первой итерации a
список res_row при добавлении буквы ['a', 4, 'b', 2, 'a']
результат с выполнения функции: 0

запуск цикла for для удаления

окончание цикла удаления
рузультат после удаления ['c', 'a', 'a']
['a', 4, 'b', 2, 'a', 0]

Process finished with exit code 0
  • Вопрос задан
  • 103 просмотра
Решения вопроса 1
Yelo
@Yelo Автор вопроса
сам ни ни)
Спасибо за советы), после как прочитал все ответы сделал так:
def run_in_letter(usr, letter):
    count = 0

    for i in usr:
        if i == letter:
            count += 1
        elif i != letter:
            print("\n запуск цикла for для удаления")
            for i in range(count):
                usr.pop(0)
            print("\n окончание цикла удаления")

    print("-----\nresult count run run_in_letter:", count)
    print("result usr run run_in_letter:", usr,"\n-----")
    return f"{letter}{count}", usr


def run_work(usr):
    print("список полученный функцией", usr)

    return usr[0]


usr = list(input())
print("данные в списке после ввода", usr)
res_row = []

while usr:
    run_work(usr)
    res_row.append(run_in_letter(usr, run_work(usr))[0])
    print(res_row)
    print(len(usr))

но не прокатило)), перечитав повторно попытался пойти путем по проще и сделал так:
usr = list(input())
# usr = 'aaaabbcaa'
count = 0
res_list = []
letter = usr[0]

for i in usr:
    if i != letter:
        # print("ловушка")
        res_list.append(letter)
        # print("буква которую добавить в res_list")
        res_list.append(str(count))
        # print("count который добавить как строка в res_list")
        count = 0
        # print("присвоено count", count)

    # print("буква для i в текущей итерации:", i)
    count += 1
    # print("значение для count в текущей итерации:", count)

    # print("присваиваем букву на этой итерации переменной letter")
    letter = i
    # print("данные в res_list", res_list)

res_list.append(letter)
res_list.append(str(count))

print("".join(res_list))

вроде бы попроще получилось)), и программа работает правильно.
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 3
Вы итерируетесь по списку и одновременно удаляете из него значения. Вероятно, это и приводит к непредвиденным результатам. Наилучшим выходом здесь будет изменить алгоритм на тот, который не будет модифицировать исходный список. В текущей реализации слишком много лишних операций - вложенные циклы, удаление. Задачу можно решить простым обходом списка с подсчетом встреченных подряд одинаковых символов.
Ответ написан
Комментировать
@twistfire92
Python backend developer
Намудрили с удалением символов и с проходом for letter in usr:
при первом проходе цикла переменной letter присваивается значение на нулевой позиции usr. Это a, и все в порядке.
потом вы все a удаляете и на втором проходе letter присваивается значение на первой позиции в usr, это b. Но уже вторая b в этой строке, т.к. строка оставшаяся - 'bbcaa'
На третьем проходе присваивается значение на второй позиции. в этот момент usr = "caa" и третий символ - a

Вот, собственно, в чем проблема вашего кода.

Чтобы понять лучше эту ситуацию, введите строку 'aaabccca', и увидете, что b там не будет
Ответ написан
ramzis
@ramzis
FullStackOverflow
Любишь костыли?, тогда держи)
def krik_dovakina(usr):
    result = ''
    count = 1
    for i in usr:
        try:
            if usr[1] == i:
                count+=1
            else:
                result += f'{i}{count}'
                count = 1
            usr = usr[1:]
        except IndexError:
            result += f'{i}{count}'
    return f'Сжатый  крик драконорожденного {result}'
print(krik_dovakina('aaaabbcaayyyyyz'))
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы