Matt Porter wrote:
Hi guys,
I'm trying to compress a string.
E.g:
"AAAABBBC" -> "ABC"
The code I have so far feels like it could be made clearer and more
succinct, but a solution is currently escaping me.
def compress_str(str):
new_str = ""
for i, c in enumerate(str):
try:
if c != str[i+1]:
new_str += c
except IndexError:
new_str += c
return new_str
Cheers
Matt
This is shorter and perhaps clearer:
def compress_str(str):
new_str = ""
for c in str:
if not new_str or c != new_str[-1]:
new_str += c
return new_str
However, successive appends to a string is inefficient (whereas
successive appends to a list are ok), so this is probably more efficient:
def compress_str(str):
r = []
for c in str:
if not r or c != r[-1]:
r.append(c) # Build a list of characters
return ''.join(r)# Join list into a single string
And then building a list in a loop is usually more efficient (and
perhaps clearer) if done with a list comprehension:
new_str = ''.join([c for i,c in enumerate(str) if not i or str[i-1]
!= c])
or, maybe clearer as two lines:
r = [c for i,c in enumerate(str) if not i or str[i-1] != c]
new_str = ''.join(r)
Gary Herron
--
http://mail.python.org/mailman/listinfo/python-list