在python中运行长度编码

时间:2016-09-19 13:30:22

标签: 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()

2 个答案:

答案 0 :(得分:0)

三条评论:

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

    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()
    

答案 1 :(得分:0)

很快得到了这个,也许还有优化的空间(例如,如果字符串太大而且内存足够,那么使用一组字母会更好用于查找的原始字符串而不是字符列表本身)。但是,这项工作是否相当有效:

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
相关问题