我在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()
答案 0 :(得分:0)
三条评论:
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()
答案 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