[英]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.