Хотелось бы ввести целые числа, такие как «01» и «07», но появляется ошибка «Недопустимый литерал».Общая программа представляет собой компрессор RLE - PullRequest
0 голосов
/ 03 июня 2019

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

Когда я набираю что-то вроде 2t7e, оно работает отлично, но когда я пытаюсь ввести его как 02t07e появляется ошибка

ValueError: invalid literal for int() with base 10: y

Мой код:

def decode(mstr):
    rle = ''

    if mstr != '':
        for i in range(0,len(mstr),2):
            number = int(mstr[i])
            character = mstr[i+1]
            rle = rle + character*number
            list1.append(rle)

    return rle



for i in range (0,linesOfRLE):                                                               
    text=input("Please enter the string to encode")
    x = decode(text)
    print(list1)

Я хотел бы ввести что-то вроде 02t04a10b и получить ttaaaabbbbbbbbbb.

Ответы [ 3 ]

0 голосов
/ 03 июня 2019

Проблема с этой строкой

number = int(mstr[i])

, поскольку, когда i = 2, тогда mstr [2] будет 't', и вы пытаетесь преобразовать букву 't' в int, чтоневозможно.

Используйте это

def decode(mstr):
    rle = ''
    j = 0
    if mstr != '':
        for i in range(0, len(mstr)):
            if mstr[i].isalpha():
                number = int(mstr[j:i])
                character = mstr[i]
                rle += character * number
                list1.append(rle)
                j = i + 1
    return rle
0 голосов
/ 03 июня 2019

Если вы можете использовать RegEx , вы можете иметь чистый и читаемый код:

import re


def decode(mstr):

    reg_res = re.findall("\d*\w", text)
    res = ''.join([x[-1]*int(x[0:-1]) for x in reg_res])

    return res

text = "02t04a10b"

print(decode(text)) 

Выход:

ttaaaabbbbbbbbbb

Объяснение строки:

reg_res = re.findall("\d*\w", text)

В этой строке мы находим все пары цифра / буква. В контексте RegEx \d* означает «все цифры», а \w означает «букву»: мы ищем все группы, образованные n цифрами, за которыми следует буква

res = ''.join([x[-1]*int(x[0:-1]) for x in reg_res])

В этой строке для каждой пары (for x in reg_res) мы берем последний символ x[-1] (мы знаем, что это наша буква) и умножаем его на предыдущее число int(x[0:-1). мы объединяем все результаты в одну строку без пробелов с ''.join(list)


Если вы не можете использовать RegEx :

def decode(mstr):
    res = []
    num = ''

    for l in mstr:

        if l.isdigit():
            num += l
        else:
            res.append(l*int(num))
            num = ''

    return ''.join(res)

text = "02t04a10b"
print(decode(text))

Выход:

ttaaaabbbbbbbbbb

Объяснение строки:

if l.isdigit():
    num += l
else:
    res.append(l*int(num))
    num = '' 

для каждого char в mstr, если char является цифрой, добавьте char к держателю номера, иначе умножьте символ для держателя номера и добавьте результат

0 голосов
/ 03 июня 2019

Ваша проблема здесь:

for i in range(0,len(mstr),2):

Вы повторяете каждый второй символ вашего ввода и берете его как число для де-кодирования.Если у вас есть многозначные суммы, это не работает: вам нужно уточнить код, чтобы справиться с этим.

Для '02t04a10b':

  • он пытается создать 0 раз '2'
  • , затем пытается преобразовать 't' в int =>недопустимый литерал

Я бы предложил запретить 01 02 чисел, если вам нужно также декодировать '14a' в 'aaaaaaaaaaaaaa' или '5142' в '111112222', вам нужно дать свою логикуеще больше «умов».


Если вы можете ограничить кодировку до A-Za-z, я предлагаю использовать .isdigit () для чтения из вашей строки столько, сколько вы получаете цифр,затем умножьте следующий с ним, затем продолжите.

См. google для python run lenght site:stackoverflow.com для вдохновения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...