在 Python 中解码数字?

问题描述

我在解码时遇到问题。 首先,字符串 '44444' 被编码为 '54'。 (5 次 4) 现在当我想解码 '54' 它是空的。 (它确实可以与字母一起使用)

算法将字符串 '4a3b2c' 解码为 'aaaabbbcc'。 现在,当我想解码 '4a54' 时,它只给出 'aaaa',但正确的解码是 'aaaa44444'。我该如何解码?

代码如下:

def decode_RLE(x):
    decode = ''
    count = ''
    for i in x:
        
        if i.isdigit():
            #append to count
            count += i
        else i: 
   
            decode += i * int(count)
            count = '' 
         
    return decode

解决方法

你可以试试string multiplication

def decode(string):
    output = ''
    for i in range(0,len(string),2):
        output += int(string[i]) * string[i + 1]
    return output

print(decode("54"))
print(decode("4a54"))

输出:

44444
aaaa44444

您甚至可以使用列表推导式:

def decode(s):
    return ''.join(int(s[i]) * s[i + 1] for i in range(0,len(s),2))
,

这是由于第一个 if 条件。在循环之后,您会得到 count = "54" 和 decode = ""。然后,该函数返回一个空字符串。

如果输入只有两位数字,技术上不需要循环。试试这个代码:

def decode_RLE(x):
    return int(x[0])*x[1]

如果输入的数字超过两位,循环和老式的切片应该可以工作:

def decode_RLE(x):
    counts = x[0:len(x):2] #get odd digits
    chars = x[1:len(x):2] #get even digits
    decode = ""
    
    i = 0
    for ch in chars:
        decode += int(counts[i])*chars[i]
        i += 1
    
    return decode
,

根据您的逻辑,您只需要一位数的长度。如果是这样,您可以像这样迭代:

def decode_rle(x):
    decoded = ''
    iter_x = iter(x)
    for n,c in zip(iter_x,iter_x):
        decoded += c * int(n)
    return decoded

但这不适用于两位或更多位数的长度

,

一个标志可以解决这个问题,告诉算法最后传递的字符是一个数字。

def decode_RLE(x):
    decode = ''
    count = ''
    was_digit = False
    for i in x:

        if was_digit:
            decode += i * int (count)
            count = ''
            was_digit = False
        
        if i.isdigit():
            count += i
            was_digit = True
         
    return decode