首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >python中的RLE ALgorithm

python中的RLE ALgorithm
EN

Stack Overflow用户
提问于 2022-04-29 00:59:02
回答 2查看 320关注 0票数 0

就像标题建议的那样,我想做一个RLE算法,而且我对此没有什么问题。

例如,在RLE算法中,如果采用aaaabbbccd,结果应该返回a4b3c2d1。

rle函数应该返回aaabbbccccddddd的压缩字符串。

rle(数据: str):str

所以应该是a3b3c4d5

这是代码,我知道这是错误的,但我不知道这是否是一个好的开始

代码语言:javascript
复制
def rle(data):
            
    data = 'aaabbbccccddddd'    
    for i in range(0,len(data)):
                                  
        if data.count(f'{i}') > 1:
           
           data.replace(i, data.count(f'{i}'))
           print(data)

print(rle(data))
EN

回答 2

Stack Overflow用户

发布于 2022-04-29 01:21:35

这应该会更好

代码语言:javascript
复制
def rle(data):
    # Initialize a few variables
    prev = None
    cnt = 0 
    res = ""
    for i in data:
        if i == prev:
           # if same char as previous one, just add one to counter
           cnt += 1
        else:
           # Check that we are not at first round and add to result
           if prev != None:
              res += "%s%s" % (cnt,prev)
           # Set new character as previous one
           prev = i
    # Add last char to result
    res += "%s%s" % (cnt,prev)
    return res
           
      
                                
print(rle("aaabbbccccddddd"))
票数 0
EN

Stack Overflow用户

发布于 2022-04-29 01:21:53

代码语言:javascript
复制
data = 'aaabbbccccddddd'
seq = []
r = None
for d in data:
    if d != r:
        seq.append(d)
        seq.append(str(1))
        r = d
    else:
        seq[-1] = str(int(seq[-1]) + 1)
print("".join(seq))

我以为这段代码很简单,所以没有解释.

我们有一个str,并希望将它转换为Char-TheNumberOfRepetitions对,比如['a',3,'b',3,'c',4,...],所以我们在str上循环一个char,当它是新的时,我们添加[char, 1]到列表,否则,我们在得到一个新的字符时,向list的最后一个元素添加1。

r变量用于新字符识别,是存储每个新字符的临时变量(如果char不等于它,则替换)

最后,我们使用['a',3,'b',3,'c',4,...]str转换为join

为什么我们使用str()int()?因为python join方法有点傻:)并抛出一个异常,如果列表中的一个元素是int.每次我们把它转换成int添加1,然后再转换到str,再次.

为什么不是map?因为我认为OP是初学者,map对他来说很复杂.

还有,更多的节奏曲方式:

代码语言:javascript
复制
def rle(data: str) -> str:
    
    seq = [data[0], 1]

    for elem in data[1:]:
        if elem != seq[-2]: 
            seq += [elem, 1]
        else:
            seq[-1] += 1
    
    return ''.join(map(str, seq))

与之相反:

代码语言:javascript
复制
def reverse_rle(data: str, end_char = '$') -> str:
    
    def convert(): return seq[:-2] + [seq[-2] * (seq[-1] or 1)]

    seq = [data[0], 0]

    for elem in data[1:] + end_char:
        if elem.isdigit():
            seq[-1] = seq[-1] * 10 + int(elem)
        else:
            seq = convert()
            if elem != end_char:
                seq += [elem, 0]
    
    return "".join(seq)

如果你不想使用end_char

代码语言:javascript
复制
def reverse_rle(data: str) -> str:
    
    def convert(): return seq[:-2] + [seq[-2] * (seq[-1] or 1)]

    seq = [data[0], 0]

    for elem in data[1:]:
        if elem.isdigit():
            seq[-1] = seq[-1] * 10 + int(elem)
        else:
            seq = convert() + [elem, 0]
    
    return "".join(convert())
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/72051723

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档