Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/loops/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
String 试图压缩字符串_String_Loops_Python 3.x - Fatal编程技术网

String 试图压缩字符串

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:

我正在尝试制作一个字符串,一些像这样的'aaaabbbcc'压缩成'a4b3c2'。 我已经有了计算“a”和压缩的权利,像这个“a4”,但我如何继续?这是我的节目:

     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
?它没有压缩。是的,它一定贴得很有趣。感谢你的帮助!谢谢你的帮助!谢谢你的帮助!如果我的帖子完全回答了你的问题,请将其标记为答案。;)