字符统计及重排 一、题目题目描述给出一个仅包含字母的字符串不包含空格统计字符串中各个字母区分大小写出现的次数并按照字母出现次数从大到小的顺序。输出各个字母及其出现次数。如果次数相同按照自然顺序进行排序且小写字母在大写字母之前。输入描述输入一行为一个仅包含字母的字符串。输出描述按照字母出现次数从大到小的顺序输出各个字母和字母次数用英文分号分隔注意末尾的分号字母和次数间用英文冒号分隔。示例1输入xyxyXX1输出x:2;y:2;X:2;1说明无示例2输入abababb1输出b:4;a:3;1说明b的出现个数比a多故b排在a之前解题思路本题要求对给定的字符串中的字母进行统计并根据字母的出现次数进行排序输出格式为 字母:出现次数并用分号分隔每组结果。需要注意以下几点关键要求区分大小写小写字母和大写字母被视为不同的字母。例如a 和 A 是不同的字符。按照字母出现次数排序首先输出出现次数最多的字母。如果多个字母的出现次数相同则需要进一步排序。自然顺序排序如果出现次数相同按照字母的自然顺序进行排序。这里的“自然顺序”指的是 ASCII 顺序。小写字母的 ASCII 值比大写字母的 ASCII 值大因此需要对同一出现次数的字母进行特殊处理即 小写字母在同等出现次数的情况下要排在大写字母之前。二、代码str1input()# 统计频率count[0]*128# 仅包含字母128位ASCII足够节省空间forchinstr1:count[ord(ch)]1max_countmax(count)res_list[]# 使用列表暂存结果# 桶排序逻辑foriinrange(max_count,0,-1):# 先小写forjinrange(ord(a),ord(z)1):ifcount[j]i:res_list.append(f{chr(j)}:{i};)# 后大写forjinrange(ord(A),ord(Z)1):ifcount[j]i:res_list.append(f{chr(j)}:{i};)# 一次性拼接输出print(.join(res_list))说明三、ord() 和 chr() 函数详解在代码中我们使用了 Python 内置的ord()和chr()函数来处理字符和 ASCII 码之间的转换。这两个函数是处理字符编码的基础工具理解它们对掌握字符串操作非常重要。1. ord() 函数ord()函数用于获取一个字符的 Unicode 码点对于 ASCII 字符就是 ASCII 码值。语法ord(character)参数character一个长度为 1 的字符串单个字符返回值返回该字符对应的 Unicode 码点整数示例print(ord(a))# 输出97print(ord(A))# 输出65print(ord(0))# 输出48print(ord( ))# 输出32在本题中的应用# 将字符转换为 ASCII 码作为数组索引count[ord(ch)]1这里ord(ch)将字符ch转换为其 ASCII 码值然后用这个值作为索引来访问count数组。2. chr() 函数chr()函数是ord()的反函数用于将 Unicode 码点整数转换回对应的字符。语法chr(code_point)参数code_point一个整数表示 Unicode 码点返回值返回该码点对应的字符长度为 1 的字符串示例print(chr(97))# 输出aprint(chr(65))# 输出Aprint(chr(48))# 输出0print(chr(32))# 输出 在本题中的应用# 将 ASCII 码转换回字符进行输出res_list.append(f{chr(j)}:{i};)这里chr(j)将整数jASCII 码值转换回对应的字符用于构建输出字符串。3. 两个函数的关系ord()和chr()是互逆操作# 对于任意字符 ccxprint(chr(ord(c))c)# 输出True# 对于任意有效的 ASCII 码值 n0-127n97print(ord(chr(n))n)# 输出True4. ASCII 码表参考了解常见的 ASCII 码值有助于理解代码字符ASCII 码说明‘A’65大写字母 A‘Z’90大写字母 Z‘a’97小写字母 a‘z’122小写字母 z‘0’48数字 0‘9’57数字 95. 在本题中的具体应用在解题代码中我们利用这两个函数实现了高效的字符统计统计频率时使用ord(ch)将字符转换为索引输出结果时使用chr(j)将索引转换回字符遍历字母范围时使用ord(a)和ord(z)获取小写字母的 ASCII 范围这种方法的优势高效直接使用数组索引时间复杂度 O(1)简洁避免了使用字典的额外开销内存友好只使用固定大小的数组128个元素6. 注意事项ord()只能接受单个字符# 错误示例ord(ab)# TypeError: ord() expected a character, but string of length 2 foundchr()的参数必须在有效范围内# 有效范围0 i 0x10ffffchr(97)# 正确chr(-1)# ValueError: chr() arg not in range(0x110000)对于非 ASCII 字符如中文ord()返回的是 Unicode 码点print(ord(中))# 输出20013print(chr(20013))# 输出中理解ord()和chr()函数是掌握 Python 字符串处理的基础它们在文本处理、加密解密、编码转换等场景中都有广泛应用。四、f-string 格式化字符串详解在解题代码中我们使用了f{chr(j)}:{i};这样的 f-string 来构建输出字符串。f-string格式化字符串字面值是 Python 3.6 引入的一种高效、简洁的字符串格式化方式。1. f-string 基本语法f-string 以f或F开头后面跟着字符串字面值其中用大括号{}包裹表达式nameAliceage25print(fMy name is{name}and I am{age}years old.)# 输出My name is Alice and I am 25 years old.2. 在本题中的应用在代码中我们使用 f-string 来构建输出格式res_list.append(f{chr(j)}:{i};)这行代码做了以下几件事chr(j)将 ASCII 码值j转换为对应的字符i当前字母的出现次数:冒号分隔符;分号分隔符用于分隔不同字母的结果最终生成的字符串格式为字符:次数;3. f-string 的优势与传统格式化方法相比f-string 有以下优势传统方法对比# 1. % 格式化旧式result%s:%d;%(chr(j),i)# 2. str.format() 方法result{}:{};.format(chr(j),i)# 3. f-string推荐resultf{chr(j)}:{i};f-string 的优势更简洁直接在字符串中嵌入表达式更易读表达式与字符串内容在一起性能更好运行时解析更快功能更强大支持复杂表达式和格式化选项4. f-string 的高级用法4.1 表达式计算x10y20print(fThe sum is{xy})# 输出The sum is 30print(fThe average is{(xy)/2})# 输出The average is 15.04.2 调用函数和方法namepythonprint(fUppercase:{name.upper()})# 输出Uppercase: PYTHONprint(fLength:{len(name)})# 输出Length: 64.3 格式化数字pi3.1415926535print(fPi:{pi:.2f})# 输出Pi: 3.14保留2位小数print(fPi:{pi:.4f})# 输出Pi: 3.1416保留4位小数number1234567print(fWith commas:{number:,})# 输出With commas: 1,234,567print(fHex:{number:x})# 输出Hex: 12d687十六进制4.4 对齐和填充nameAliceprint(fRight aligned:{name:10})# 输出Right aligned: Aliceprint(fLeft aligned:{name:10})# 输出Left aligned: Aliceprint(fCenter aligned:{name:^10})# 输出Center aligned: Aliceprint(fWith padding:{name:_10})# 输出With padding: Alice_____4.5 日期时间格式化fromdatetimeimportdatetime nowdatetime.now()print(fCurrent time:{now:%Y-%m-%d%H:%M:%S})# 输出Current time: 2023-10-15 14:30:255. 在本题中的具体格式化需求本题要求输出格式为字母:次数;使用 f-string 非常合适# 原始代码中的使用res_list.append(f{chr(j)}:{i};)# 等价于charchr(j)counti formatted_stringf{char}:{count};res_list.append(formatted_string)为什么选择 f-string简洁性一行代码完成字符串构建可读性清晰展示格式模板类型安全自动处理不同类型的数据性能比字符串拼接或 format() 方法更快6. 注意事项6.1 大括号转义如果需要在 f-string 中显示字面的大括号需要使用双重大括号# 错误示例# print(fValue: {x}) # 这会被解析为表达式# 正确示例print(fValue: {{x}})# 输出Value: {x}print(f{{Hello}})# 输出{Hello}6.2 表达式中的引号如果表达式本身包含引号需要注意转义nameAlice# 正确print(fName:{name!r})# 输出Name: Alice使用 repr()print(fName:{name})# 输出Name: Alice# 如果字符串本身用双引号表达式可以用单引号print(fHe said {name})# 输出He said Alice6.3 空表达式大括号不能为空# 错误示例# print(f{}) # SyntaxError: f-string: empty expression not allowed# 正确示例print(f{})# 输出空字符串6.4 多行 f-stringf-string 可以跨越多行但每行都需要以f开头# 正确message(fName:{name}\nfAge:{age}\nfScore:{score})# 或者使用三引号messagefName:{name}Age:{age}Score:{score}7. 与其他格式化方法对比方法示例优点缺点% 格式化%s:%d % (char, count)兼容旧版本类型安全差可读性低str.format(){}:{}.format(char, count)功能强大类型安全语法稍复杂性能一般f-stringf{char}:{count}简洁、可读、性能好需要 Python 3.68. 在本题中的完整应用流程结合ord()、chr()和 f-string本题的完整处理流程如下# 1. 输入字符串str1xyxyXX# 2. 统计频率使用 ord()count[0]*128forchinstr1:count[ord(ch)]1# ord() 将字符转为 ASCII 索引# 3. 构建结果使用 chr() 和 f-stringres_list[]max_countmax(count)foriinrange(max_count,0,-1):# 小写字母forjinrange(ord(a),ord(z)1):ifcount[j]i:res_list.append(f{chr(j)}:{i};)# chr() 转回字符f-string 格式化# 大写字母forjinrange(ord(A),ord(Z)1):ifcount[j]i:res_list.append(f{chr(j)}:{i};)# 4. 输出结果print(.join(res_list))# 输出x:2;y:2;X:2;9. 总结f-string 是现代 Python 编程中推荐的字符串格式化方式它语法简洁直接在字符串中嵌入表达式执行高效运行时性能优于其他格式化方法功能强大支持复杂表达式和格式化选项可读性好代码意图一目了然在本题中f-string 与ord()、chr()函数配合使用形成了高效、简洁的字符统计和格式化输出方案。掌握这些工具对于编写高质量的 Python 代码非常重要。