问题:把 'aaabbcd' 输出 'a3b2cd','a' 输出 'a','aaa' 输出 'a3'。即没有重复则直接输出字符串,有重复就输出字符串和个数
方法一:
思路:
1. 循环字符串,当相邻两个字符串不同时,在中间加一个分隔符,比如 '.',最后得到一个新字符串。比如 aaabcd 变成 aaa.b.c.d
2. 把新字符串按照分隔符分割成列表。如 aaa.b.c.d 变成 ['aaa', 'b', 'c', 'd']
3。处理列表,拼接字符串
但是有 bug: 如果字符串本身带有设置的分隔符,在 split() 的时候会出问题,比如 字符串本身就带 '.'
def get_new_str(mystr='aaabbccaa'):
"""
:param mystr: 传入字符串
:return:
"""
new_str = '' # 初始化新字符串
first_word = mystr[0] # 从第一个字符开始匹配
for i in mystr:
if i == first_word: # 循环字符串,如果字符和 first_word 相同时,表示字符有重复
new_str += i # 拼接新字符串
else:
new_str += '.' + i # 字符与 first_word 不同时,表示出现新字符了,在旧字符和新字符直接添加一个分割符号,如 '.'
first_word = i # 将新字符赋值给 first_word
print('处理后的字符串为: ', new_str)
new_di = new_str.split('.') # 把新字符串按照分割符分割成列表,列表每个元素都是一个字符串
print('处理后的列表为:', new_di)
new_str1 = '' #初始化字符串
for st in new_di: # 循环处理列表
n = len(st)
if n == 1:
new_str1 += st
if n > 1:
new_str1 += st[0] + str(n)
return new_str1 # 返回处理后的字符串
如下图红框中就是该段代码的 Bug:
方法二:
思路:
1. 取字符串第一个字符,赋值给 first_word,然后循环字符串,统计等于第一个字符的个数。如 'aaabbccaa' 可以知道 first_word 是 'a'
2. 定义一个计数变量,用于统计字符的个数,初始化为 0
3. 循环,直到不等于下一个字符的时候;此时可以知道前一个字符重复了几次,可以拼接字符串了;
4. 拼接完了后需要将新字符赋值给 first_word,还需要把计数变量重置为 1(为什么不是 0,是因为此次循环已经是在新字符上了)
5. 这里有个问题,就是循环到最后一个或多个('a'或者'aaa'这种)字符的时候,走不到 else 里面去,拼接不到最后字符串,因此事先在传入的字符串
后面给加一个字符,不等于原字符串的最后一个字符就行
def get_new_str1(mystr='aaabbcaad'):
"""
:param mystr:
:return:
"""
end_word = '#' if mystr[-1] == '*' else '*' # 传进来字符串最后一位是 '*', 则在字符串后面加个 '#';反之,都加 '*'
# print(end_word)
mystr_add_end_word = mystr + end_word
print('添加字符后为: ', mystr_add_end_word) # 加了尾巴后的新字符串
first_word = mystr_add_end_word[0] # 第一个字符
new_str = '' # 初始化字符串
word_count = 0 # 字符计数
for i in mystr_add_end_word: # 循环
if i == first_word:
word_count += 1 # 如果等于,则说明是重复的字符,计数变量加 1
else: # 元素不等于第,说明第前一个字符已经计数完成
if word_count > 1: # 判断字符计数,大于 1 则拼接字符+字符数量
new_str += first_word + str(word_count)
if word_count == 1: # 等于 1 则拼接字符
new_str += first_word
word_count = 1 # 前一个字符计数完成,开始计算新字符的次数,此时将计数赋值为 1,(为什么不是 0,是因为此时已经循环到下一个字符了)
first_word = i # 更新 first_word
return new_str
如下图,就没有上面那种 Bug: