给定包含大写字母(A-Z)的字符串,请使用“运行长度”编码压缩该字符串

时间:2019-07-12 18:13:04

标签: python string run-length-encoding

给出一个包含大写字母(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

6 个答案:

答案 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上进行了演示

https://repl.it/repls/RowdyFloralwhiteBlockchain

答案 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