解码 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
我的解码有问题。
首先,字符串 '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