Python实现字符统计并按大小写交替字母顺序排序
问题描述
需要编写一个Python程序,要求:
- 接收长度不小于20的字符串
- 统计每个字符的出现次数
- 按
A-a-B-b-C-c的字母顺序展示统计结果
测试语句:"She sells sea shells down by the seashore"
期望输出:
{' ': 7, 'a': 2, 'b': 1, 'd': 1, 'e': 7, 'h': 4, 'l': 4, 'n': 1, 'o': 2, 'r': 1, 'S': 1, 's': 7, 't': 1, 'w': 1, 'y': 1}
我的尝试
方法一:实现统计但大小写未相邻排序
此方法完成了字符统计和字母排序,但大小写字符没有按预期相邻排列:
# 第一种方法实现了统计与字母排序,但大小写字符未按预期相邻 def main(): input_str = str(input("请输入一段短语:\n")) if len(input_str) < 20: print("请输入长度不小于20的短语。") else: res = {} for keys in sorted(input_str): res[keys] = res.get(keys, 0) + 1 print("输入短语的字符统计结果:\n" + str(res)) main()
运行测试语句的输出:
{' ': 7, 'S': 1, 'a': 2, 'b': 1, 'd': 1, 'e': 7, 'h': 4, 'l': 4, 'n': 1, 'o': 2, 'r': 1, 's': 7, 't': 1, 'w': 1, 'y': 1}
方法二:实现预期排序但未统计次数
此方法用lambda实现了A-a-B-b的排序逻辑,但没有统计字符出现次数,仅输出排序后的字符列表:
# 第二种方法用lambda实现了预期排序,但未统计字符出现次数 def main(): input_str = str(input("请输入一段短语:\n")) if len(input_str) < 20: print("请输入长度不小于20的短语。") else: sorted_list = sorted(input_str, key=lambda s: (s.upper(), s)) print("输入短语的字符统计结果:\n", sorted_list) main()
运行测试语句的输出:
[' ', ' ', ' ', ' ', ' ', ' ', ' ', 'a', 'a', 'b', 'd', 'e', 'e', 'e', 'e', 'e', 'e', 'e', 'h', 'h', 'h', 'h', 'l', 'l', 'l', 'l', 'n', 'o', 'o', 'r', 'S', 's', 's', 's', 's', 's', 's', 's', 't', 'w', 'y']
请问如何结合两种方法实现需求,或是我的思路有误?
解决方案
你可以把统计字符次数和自定义排序逻辑分开处理:先完成字符计数,再对计数后的字符键按照A-a-B-b的规则排序,最后生成有序字典(Python 3.7及以上版本的字典默认保留插入顺序)。
具体实现代码如下:
def main(): input_str = input("请输入一段短语:\n") if len(input_str) < 20: print("请输入长度不小于20的短语。") return # 第一步:统计每个字符的出现次数 count_dict = {} for char in input_str: count_dict[char] = count_dict.get(char, 0) + 1 # 第二步:按照自定义规则排序字符键 # 排序规则:先按字符大写后的顺序,再按原字符(确保大写在前,小写在后) sorted_chars = sorted(count_dict.keys(), key=lambda c: (c.upper(), c)) # 第三步:生成有序的统计字典 sorted_count_dict = {char: count_dict[char] for char in sorted_chars} print("输入短语的字符统计结果:\n", sorted_count_dict) main()
运行测试语句的输出:
{' ': 7, 'a': 2, 'b': 1, 'd': 1, 'e': 7, 'h': 4, 'l': 4, 'n': 1, 'o': 2, 'r': 1, 'S': 1, 's': 7, 't': 1, 'w': 1, 'y': 1}
逻辑说明
- 统计字符次数:遍历输入字符串,用字典记录每个字符的出现次数,这部分和你第一种方法的逻辑一致。
- 自定义排序:对字典的键使用
sorted()函数,排序键设置为(c.upper(), c)——先按字符大写后的ASCII值排序(保证同一字母的大小写归为一组),再按原字符排序(保证大写字母排在小写字母前面)。 - 生成有序字典:根据排序后的键列表,重新构建字典,Python 3.7+的字典会保留键的插入顺序,最终输出符合预期的排序结果。
内容的提问来源于stack exchange,提问作者ForeverLost20
相关产品推荐
相关产品推荐

