运行长度解码Python:字符串索引超出范围错误

时间:2018-07-16 11:25:03

标签: python-3.x

我正在尝试用Python编写代码来解码游程编码。例如:

print(decode(a3b3c3))

会返回:

aaabbbccc

但是,如果我为数量输入两位数字,则:

a10b3c2

它抛出一个字符串索引错误

我该如何修正我的代码,使其接受除一位数字以外的数字?

def decode(text):
    if not text:
        return ""
    else:
        char, no, i = text[0], int(text[1]), 1
        i+=1
        return char*no + decode(text[i:])

print(encode(a10b2c3))

2 个答案:

答案 0 :(得分:0)

您正在尝试使用数字索引解析字符串,这从来都不是一个好主意。如果数字有3或4位数字怎么办?使用正则表达式的最佳方法,例如:

aaaaaaaaaabbccc

打印:

import pandas as pd
import numpy as np

rands = np.random.random(7)
days = ['Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday']
dates = pd.date_range('2018-01-01', '2018-01-07')

df = pd.DataFrame({'date': dates, 'days': days, 'y': rands})

df_days_onehot = pd.get_dummies(df.days)[days]
df[days] = df_days_onehot
df['target'] = df.y.shift(-1)

df.drop('days', axis=1, inplace=True)
df.set_index('date', inplace=True)

X = df.iloc[:, :-1].values
y = df.iloc[:, -1].values

答案 1 :(得分:0)

您可以使用more_itertools.run_length.decode()

给予


import more_itertools as mit


compressed = [(char, int(n)) for char, n in mit.sliced("a3b3c3", 2)]

代码

"".join(mit.run_length.decode(compressed))
# 'aaabbbccc'

详细信息

compressed值只是将输入准备为(字符,数字)对,这是此特定API所必需的。

compressed
# [('a', 3), ('b', 3), ('c', 3)]

more_itertools是第三方库。通过λ pip install more_itertools

安装