繁体   English   中英

python中的运行长度编码

[英]Run Length Encoding in python

我有作业要在 python 中做“运行长度编码”,我写了一个代码,但它打印了我不想要的其他东西。 它只打印字符串(就像他写的那样)但我希望它打印字符串,如果在这个字符串中有超过一次的字符,它将只打印一次字符并且接近它的次数她出现在字符串中。 我怎样才能做到这一点?

例如:

字符串:'lelamfaf'

结果:'l2ea2mf2

def encode(input_string):
        count = 1
        prev = ''
        lst = []
        for character in input_string:
            if character != prev:
                if prev:
                    entry = (prev, count)
                    lst.append(entry)
                    #print lst
                count = 1
                prev = character
            else:
                count += 1
        else:
            entry = (character, count)
            lst.append(entry)
        return lst    


def decode(lst):
        q = ""
        for character, count in lst:
            q += character * count
        return q    


def main():
        s = 'emanuelshmuel'
        print decode(encode(s))    

if __name__ == "__main__":
        main()

三注:

  1. 您应该将现有的方法str.count用于encode函数。
  2. decode函数将打印一个字符的count次,而不是字符及其计数器。
  3. 实际上decode(encode(string))组合是一个编码函数,因为您没有从编码结果中检索起始字符串。

这是一个工作代码:

def encode(input_string):
    characters = []
    result = ''
    for character in input_string:
        # End loop if all characters were counted
        if set(characters) == set(input_string):
            break
        if character not in characters:
            characters.append(character)
            count = input_string.count(character)
            result += character
            if count > 1:
                result += str(count)
    return result

def main():
        s = 'emanuelshmuel'
        print encode(s)
        assert(encode(s) == 'e3m2anu2l2sh')
        s = 'lelamfaf'
        print encode(s)
        assert(encode(s) == 'l2ea2mf2')

if __name__ == "__main__":
        main()

这么快就想出来了,也许还有优化的空间(例如,如果字符串太大并且有足够的内存,最好使用原始字符串的一组字母而不是字符列表进行查找本身)。 但是,这项工作相当有效:

text = 'lelamfaf'
counts = {s:text.count(s) for s in text}

char_lst = []
for l in text:
    if l not in char_lst:
        char_lst.append(l)
        if counts[l] > 1:
            char_lst.append(str(counts[l]))

encoded_str = ''.join(char_lst)
print encoded_str

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM