Python压缩字符串不太正确

Python压缩字符串不太正确,python,string,Python,String,我有以下代码,它在docstring中是自解释的。如何使它不以1标记单个字母,从而将最终压缩字符串中的单个数字转换为2 例如,在docstring中,它变成aaabbbcdddd->A3B4C1D4,但我希望它变成A3B4CD4。我是新来的,所以非常感谢您的评论 class StringCompression(object): ''' Run Length Compression Algorithm: Given a string of letters, such as

我有以下代码,它在docstring中是自解释的。如何使它不以1标记单个字母,从而将最终压缩字符串中的单个数字转换为2

例如,在docstring中,它变成aaabbbcdddd->A3B4C1D4,但我希望它变成A3B4CD4。我是新来的,所以非常感谢您的评论

class StringCompression(object):
    '''
    Run Length Compression Algorithm: Given a string of letters, such as
    nucleotide sequences, compress it using numbers to flag contiguous repeats.
    Ex: AAABBBBCDDDD -> A3B4C1D4


    >>>x = StringCompression('AAAAbC')
    >>>x.compress()
    'A4bC'
    '''
    def __init__(self, string):
        self.string = string

    def compress(self):
        '''Executes compression on the object.'''
        run = ''
        length = len(self.string)

        if length == 0:
            return ''

        if length == 1:
            return self.string #+ '1'

        last = self.string[0]

        count = 1

        i = 1

        while i < length:

            if self.string[i] == self.string[i - 1]:
                count += 1

            else:
                run = run + self.string[i - 1] + str(count)
                count = 1

            i += 1

        run = (run + self.string[i - 1] + str(count))

        return run
类字符串压缩(对象):
'''
运行长度压缩算法:给定一个字母字符串,如
核苷酸序列,使用数字对其进行压缩以标记连续重复。
例如:aaabbbcdddd->A3B4C1D4
>>>x=字符串压缩('AAAAbC')
>>>x、 压缩()
“A4bC”
'''
定义初始化(self,字符串):
self.string=string
def压缩(自我):
''对对象执行压缩''
运行=“”
长度=长度(self.string)
如果长度==0:
返回“”
如果长度==1:
返回self.string#+'1'
last=self.string[0]
计数=1
i=1
而我<长度:
如果self.string[i]==self.string[i-1]:
计数+=1
其他:
run=run+self.string[i-1]+str(计数)
计数=1
i+=1
run=(run+self.string[i-1]+str(count))
回程

这里有一个使用
itertools.groupby
和生成器的替代解决方案:

from itertools import chain, groupby

x = 'AAABBBBCDDDD'

def compressor(s):
    for i, j in groupby(s):
        size = len(list(j))
        yield (i, '' if size==1 else str(size))

res = ''.join(chain.from_iterable(compressor(x)))

print(res)

A3B4CD4

现在它按照我想要的方式工作。谢谢

class StringCompression(object):
    '''
    Run Length Compression Algorithm: Given a string of letters, such as
    nucleotide sequences, compress it using numbers to flag contiguous repeats.
    Ex: AAABBBBCDDDD -> A3B4CD4
    Notice that single letter do not get a 1 flag to prevent expansion.

    >>>x = StringCompression('AAAAbC')
    >>>x.compress()
    'A4bC'
    '''
    def __init__(self, string):
        self.string = string

    def compress(self):
        '''Executes compression on the object.'''
        run = ''
        length = len(self.string)

        if length == 0:
            return ''

        if length == 1:
            return self.string #+ '1'

        last = self.string[0]

        count = 1

        i = 1

        while i < length:

            if self.string[i] == self.string[i - 1]:
                count += 1

            else:
                run = run + self.string[i - 1] + str(count)
                count = 1

            i += 1

        run = (run + self.string[i - 1] + str(count))

        compressed_string = ''
        for i in run:
            if i != '1':
                compressed_string += i

        return compressed_string
类字符串压缩(对象):
'''
运行长度压缩算法:给定一个字母字符串,如
核苷酸序列,使用数字对其进行压缩以标记连续重复。
例如:aaabbbcdddd->A3B4CD4
请注意,单个字母不能使用1标志来防止扩展。
>>>x=字符串压缩('AAAAbC')
>>>x、 压缩()
“A4bC”
'''
定义初始化(self,字符串):
self.string=string
def压缩(自我):
''对对象执行压缩''
运行=“”
长度=长度(self.string)
如果长度==0:
返回“”
如果长度==1:
返回self.string#+'1'
last=self.string[0]
计数=1
i=1
而我<长度:
如果self.string[i]==self.string[i-1]:
计数+=1
其他:
run=run+self.string[i-1]+str(计数)
计数=1
i+=1
run=(run+self.string[i-1]+str(count))
压缩字符串=“”
对于我在运行:
如果我1':
压缩字符串+=i
返回压缩字符串

字符是否仅按字母顺序出现,并且每个字符仅出现一次?IE是可能的字符串“AAABBAA”吗?也许你应该考虑另一个数据结构,这里你不能编码数字字符,这也是有效的。但有人明确告诉我不要使用itertools。也许我应该澄清一下,在我的作品@neuralnetic中,没问题,这个解决方案可能会帮助其他想要使用
itertools
(标准库的一部分)的人。