解码 Python 中的数字?

Decode digits in 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))

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

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

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

这是第一个 if 条件造成的。在循环之后你得到 count = "54" 和 decode = ""。然后,函数return一个空字符串。

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

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):
    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