簡體   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