如何用Python统计指定子串和字符的出现次数并存入字典
问题:同时统计字符串中字符与子串的出现次数
需求:统计给定字符串中,指定列表内所有字符和子串的出现次数,结果以字典返回(顺序无关)。示例如下:
string = "Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua" target_list = ["a","em","i","el"] expected_result = {'a': 7, 'em': 2, 'i': 11, 'el': 1}
编写的错误代码:
frequencies = {} test_string = "Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua" test_list = ["a","em","i","el"] for char in test_list: for char in test_string: if char in test_list: if char in frequencies: frequencies[char] += 1 else: frequencies[char] = 1 print(frequencies)
错误代码返回结果:
{'i': 44, 'a': 28}
期望得到同时包含字符和子串统计的结果:
{'a': 7, 'em': 2, 'i': 11, 'el': 1}
请问如何实现同时统计字符串中的子串和字符并将结果存入同一个字典?
解决方案
问题分析
你之前的代码存在两个核心问题:
- 嵌套循环重复使用变量名
char,外层循环的子串被内层循环的单个字符覆盖,完全没处理长度大于1的子串; - 仅遍历字符串的单个字符,未检查子串的匹配情况,导致长于1的目标元素被忽略。
基础实现代码
遍历目标列表中的每个元素,针对每个元素(字符或子串)统计其在字符串中的出现次数:
def count_matches(s, targets): frequencies = {} for target in targets: count = 0 target_length = len(target) # 遍历所有可能的起始索引,避免切片越界 for i in range(len(s) - target_length + 1): if s[i:i+target_length] == target: count += 1 frequencies[target] = count return frequencies test_string = "Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua" test_list = ["a","em","i","el"] result = count_matches(test_string, test_list) print(result)
代码说明
- 外层循环遍历目标列表中的每个元素;
- 计算当前目标元素的长度,确定字符串中可匹配的起始索引范围;
- 通过切片取出对应长度的子串与目标元素对比,匹配则计数加1;
- 将每个目标元素的最终计数存入字典。
运行后会得到期望结果:
{'a': 7, 'em': 2, 'i': 11, 'el': 1}
简洁优化版本
利用Python内置的str.count()方法可以简化代码,该方法会自动统计子串的非重叠出现次数,逻辑与需求完全一致:
def count_matches(s, targets): return {target: s.count(target) for target in targets} test_string = "Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua" test_list = ["a","em","i","el"] print(count_matches(test_string, test_list))
这个版本代码更简洁,执行效率也更高,输出结果和基础实现完全相同。
内容的提问来源于stack exchange,提问作者Luna
相关产品推荐
相关产品推荐

