• Python 把 'aaabbcd' 输出 a3b2cd。即没有重复则直接输出字符串,有重复就输出字符串和个数


    问题:把  '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:



  • 相关阅读:
    JVM系列文章(三):Class文件内容解析
    android开发 不注意的异常
    【数据结构】二叉树
    Android解析中国天气网的Json数据
    最简单也最难——怎样获取到Android控件的高度
    Android通过HTTP POST带參訪问asp.net网页
    js 推断 当页面无法回退时(history.go(-1)),关闭网页
    SQL Server数据库存储过程的异常处理
    SQL Server代码如何快速格式化,sqlserver代码
    sql server 获取指定格式的当前日期
  • 原文地址:https://www.cnblogs.com/lipx9527/p/16428782.html
Copyright © 2020-2023  润新知