'abbdsjjtb',找出该字符串中最后一个只出现一次的字符,并且得到这个字符的位置
# !/usr/bin python3 # encoding: utf-8 -*- # 作业1:'abbdsjjtb',找出该字符串中最后一个只出现一次的字符,并且得到这个字符的位置 # 分析: # 两个关键点:只出现一次 最后一个 # 列表里有一个count方法可以统计列表元素出现的次数,题目给的是一个字符串,那么如何将字符串转成列表? # 需要统计每一个字符,那么意味着需要遍历上述转换后的列表 # 遍历时找到每个字符对应的次数,判断为1的进行收集,使用列表 # # s = 'abbdsjjtb' # s_list=list(s) # only_one_list = [] # 这个列表是用来存放只出现一次的元素的,那么他的最后一个元素就是目标 # for char in s_list:#char就表示的是每一个字符 # count = s_list.count(char) # if count==1: # # print(char) # only_one_list.append(char) # last_char = only_one_list[-1] # print(last_char) # # 最后得到位置 # print(s.find(last_char)) """ 1. 封装一个函数,传递任意的字符串,统计该字符串所有的子串出现的次数,并降序输出 这个函数所做的事情,就是找出入参当中所有包含的子串 (例如:abcdcccabcc是入参,bcd、bc都是子串,ac不是,包含关系,最少2个字符), 并统计每一种子串在入参当中出现的次数,降序输出,例如ab出现了2次。 """ """ 分析: 关键点:找所有子串 统计次数 降序输出 找所有子串:abcdcccabcc 第一次: ab abc abcd abcdc abcdcc abcdccc abcdccca abcdcccab abcdcccabc abcdcccabcc 第二次: bc bcd bcdc bcdcc bcdccc bcdccca bcdcccab bcdcccabc bcdcccabcc 第三次: cd cdc cdcc cdccc cdccca cdcccab cdcccabc cdcccabcc 规律: 每个字符作为开始一直找到最后,两层for循环使用字符串切片得到所有子串 统计次数: 列表里有一个count函数可以统计每一个元素出现的次数,将上述得到的所有子串存入列表 降序输出: 由于要排序,因此每一个子串和他的次数应该具备对应关系ab:1 abc:4 abcd:5 什么样的类型可以存储这种对应关系数据?字典 遍历子串对应的列表,统计每一个子串的次数,并且将子串作为key,次数作为value进行存储 按照每个子串出现的次数降序输出 """ def find_sub_str_order(s): # s = 'abcdcccabcc' length = len(s) sub_str_list = [] for i in range(length): # s[0:2] # s[0:3] # s[0:4] # s[0:5] # s[0:12] for j in range(i + 2, length + 1): sub_str = s[i:j] sub_str_list.append(sub_str) sub_str_dict = {} for sub_str in sub_str_list: count = sub_str_list.count(sub_str) sub_str_dict[sub_str] = count print(sub_str_dict) # sub_str_dict.items() 字典的每一个item是一个元组('abc', 2) # lambda 冒号之前是入参,在这里参数就是每一个item元组kv=('abc', 2) # lambda 冒号之后是返回值,因为我们要按照次数进行排序,次数在每一个item元组里属于第2个元素,所以是kv[1] print(sorted(sub_str_dict.items(), key=lambda kv: kv[1], reverse=True)) if __name__ == '__main__': find_sub_str_order('ryyrererdff') # s='sdjaffdh' # print(s[2:-3])