[英]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()
三注:
str.count
用於encode
函數。decode
函數將打印一個字符的count
次,而不是字符及其計數器。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.