String 试图压缩字符串
我正在尝试制作一个字符串,一些像这样的'aaaabbbcc'压缩成'a4b3c2'。 我已经有了计算“a”和压缩的权利,像这个“a4”,但我如何继续?这是我的节目:String 试图压缩字符串,string,loops,python-3.x,String,Loops,Python 3.x,我正在尝试制作一个字符串,一些像这样的'aaaabbbcc'压缩成'a4b3c2'。 我已经有了计算“a”和压缩的权利,像这个“a4”,但我如何继续?这是我的节目: def compress(estring): cstring= '' ct2=0 npos = estring[ct2] ct=0 for char in estring: if char == npos:
def compress(estring):
cstring= ''
ct2=0
npos = estring[ct2]
ct=0
for char in estring:
if char == npos:
ct+=1
ct2+=1
cstring += npos + str(ct)
return cstring
这是我的解决办法。它利用了迭代(而不是索引)的速度优势,并以线性时间运行
def compress(string):
prevchar = string[:1]
cnt = 1
result = []
for char in string[1:]:
if char == prevchar:
cnt += 1
else:
result.append(prevchar+str(cnt))
cnt = 1
prevchar = char
return ''.join(result) + prevchar + str(cnt)
我用timeit对它进行了测试,它似乎比上面的解决方案运行得快一点。缺点是我的解决方案不太像Python:
import timeit
avg = lambda x: sum(x) / len(x)
avg(timeit.repeat(
stmt = lambda: compress('aaaabbbcc'),
repeat = 100,
number = 1000))
在我的机器上为我提供24.7毫秒,而其他的在28-46之间
它也足够通用,不仅可以用于字符,还可以用于字符串:
compress(['ba','ba','ba','boon','boon'])
#Gives 'ba3boon2'
将为您完成所有工作:
s = 'aaaabbbcc'
from itertools import groupby
print("".join([k+str(sum(1 for _ in v)) for k, v in groupby(s)]))
a4b3c2
如果必须使用函数,请跟踪最后一个字符,当遇到与前一个字符不同的字符时,生成该字符和当前计数,然后重置计数并继续:
def compress(s):
it = iter(s)
prev, i = next(it), 0
for ch in s:
if ch != prev:
yield prev + str(i)
i = 0
prev = ch
i += 1
yield prev + str(i)
print("".join(compress(s)))
输出相同:
a4b3c2
您可以使用正则表达式将字符串拆分为重复的部分,然后创建一个计算这些部分的新字符串,例如:
import re
REPETITIONS_REGEXP = re.compile(r'(.)(\1*)') # match any char and its repetitions
def compact(data):
# Get a list with chars and repetions, like [('a', 'aaa'), ('b', 'bb'), ...]
result = REPETITIONS_REGEXP.findall(data)
# Create a new string with "char" + (its repetitions + 1)
return ''.join(['{}{}'.format(x, len(y) + 1) for (x, y) in result])
print compact('aaaabbccc') # will print 'a4b2c3'
首先,您需要正确缩进代码。如果你的字符串是
python
,那么压缩后的字符串将是p1y1t1h1o1n1
?它没有压缩。是的,它一定贴得很有趣。感谢你的帮助!谢谢你的帮助!谢谢你的帮助!如果我的帖子完全回答了你的问题,请将其标记为答案。;)