python中的游程编码

python中的游程编码,python,Python,我有家庭作业要用python进行运行长度编码,我写了一段代码,但这是我不想要的。它只打印字符串,就像他写的一样,但我希望它打印字符串,如果任何字符在这个字符串中超过一次,它将只打印字符一次,并在它附近打印字符在字符串中出现的次数。我该怎么做 例如: 字符串:“lelamfaf” 结果是:'l2ea2mf2 def encode(input_string): count = 1 prev = '' lst = [] for chara

我有家庭作业要用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()
三点意见:

对于encode函数,应该使用现有的方法str.count。 解码功能将打印字符的计数倍,而不是字符及其计数器的计数倍。 实际上,decodeCodeString组合是一个编码函数,因为您不会从编码结果中检索起始字符串。 以下是工作代码:

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

请把你的凹痕修好你的凹痕还是破的。你能修好吗?这是几秒钟