给出一个包含大写字母(A-Z)的字符串,使用“运行长度”编码压缩该字符串。重复字符必须通过存储该游程的长度来替换。
我尝试了以下代码
#Code 1: Tried on my own
def encode(message):
list1=[]
for i in range (0,len(message)):
count = 1
while(i < len(message)-1 and message[i]==message[i+1]):
count+=1
i+=1
list1=str(count)+message[i]
return list1
encoded_message=encode("ABBBBCCCCCCCCAB")
print(encoded_message)
Input:AAAABBBBCCCCCCCC
Expected Output: 4A4B8C
#code 2:I tried this by looking at another code based on run-length encoding
def encode(message):
list1=[]
count=1
for i in range (1,len(message)):
if(message[i]==message[i-1]):
count+=1
else:
list1.append((count,list1[i-1]))
count=1
if i == len(messege) - 1 :
list1.append((count , data[i]))
return list1
encoded_message=encode("ABBBBCCCCCCCCAB")
print(encoded_message)
输入:AAAABBBBCCCCCCCC
预期输出:4A4B8C
第一个代码将输出显示为2B
答案 0 :(得分:0)
def encode(message):
pairs = []
for char in message:
if len(pairs) > 0:
if pairs[-1][0] == char:
pairs[-1] = (char, pairs[-1][1] + 1)
else:
pairs.append((char, 1))
else:
pairs.append((char, 1))
strings = []
for letter, count in pairs:
strings.append(f"{count}{letter.upper()}")
return "".join(strings)
print(encode("ABBBBCCCCCCCCAB"))
print(encode("AAAABBBBCCCCCCCC"))
这将输出:
1A4B8C1A1B
4A4B8C
答案 1 :(得分:0)
这是itertools中groupby
函数的很好用法:
from itertools import groupby
message = 'AAAABBBBCCCCCCCC'
''.join('{}{}'.format(len(list(g)), c) for c, g in groupby(message))
答案 2 :(得分:0)
根据您的代码#2方法,我对其进行了调整,使其像您在“预期输出:4A4B8C”中一样提供输出
基本上,您在列表中返回一个元组,因此需要将其改为字符串,然后将您还使用的数据添加到其中,但没有数据变量,并且尝试查找消息的内容,而不是列表,因此代码应该是
def encode2(message):
encoded_return_message = ""
count=1
for i in range (1,len(message)):
if(message[i]==message[i-1]):
count+=1
else:
encoded_return_message += (f'{count}{message[i-1]}')
count=1
if i == len(message) - 1 :
encoded_return_message +=(f'{count}{message[i]}')
return encoded_return_message
encoded_message=encode2("ABBBBCCCCCCCCAB")
print(str(encoded_message))
我还在Repl.it上进行了演示
答案 3 :(得分:0)
我个人将使用re
模块按照以下方式执行该任务:
import re
text = 'AAAABBBBCCCCCCCC'
def sub_function(m):
span = m.span()
return f"{span[1]-span[0]}"+m.groups()[0]
out = re.sub(r'(\w)(\1*)',sub_function,text)
print(out)
输出:
4A4B8C
说明:re.sub
中的模式正在寻找字母,后跟0
或更多个相同字母的出现,而不是每个这样的子字符串都被馈送到sub_function
,后者计算子字符串的总长度并返回该值与子字符串的第一个字母(与其他所有字母相同)串联在一起。请注意,我在代码中使用了所谓的f字符串,而在旧版本中则不可用(我在Python 3.6.7
中测试了我的代码),如果您必须使用旧版本,则需要使用其他字符串格式设置方法。另请注意,如果您希望保留单个字母而不添加{{1, }},然后将1
的第一个参数从ABC
更改为1A1B1C
尽管也许现在我是一个锤子到处都看到钉子的家伙。
答案 4 :(得分:0)
def encode(message):
count=0
characters=''
previous_char=message[0]
result=''
length=len(message)
i=0
while(i!=length):
character=message[i]
if previous_char==character:
count=count+1
else:
result=result+str(count)+previous_char
count=1
previous_char=character
i=i+1
return result+str(count)+str(previous_char)
encoded_messsage=encode("ABBBBCCCCCCCCAB")
print(encoded_message)
输入为:ABBBBCCCCCCCCAB
输出为:1A4B8C1A1B
答案 5 :(得分:0)
def encodeString(s):
encoded = ""
ctr = 1
for i in range(len(s)-1):
if s[i]==s[i+1]:
ctr += 1
i += 1
else:
encoded = encoded + str(ctr) + s[i]
i += 1
ctr = 1
#print(encoded)
encoded = encoded + str(ctr) + s[i]
#print(encoded)
return encoded
输入:“AAAAABBCCDDAB” 输出:5A2B2C4D1A1B