Python递归统计嵌套列表内字符串出现次数的功能实现需求
嵌套列表结构字符串频次统计递归实现
需求说明
输入为任意嵌套层级的列表结构,元素仅为字符串或子列表,需要统计所有字符串在整个结构中的总出现次数,返回统计结果字典。
待实现函数签名
def count_strings(data: list, pos=None, result: dict = None) -> dict: """ :param data: 待统计的嵌套列表结构 :param pos: 当前遍历的列表下标位置 :param result: 累计统计结果字典 :return: 字符串为键、对应出现次数为值的统计字典 """
原有尝试代码问题分析
现有代码存在几个核心逻辑错误:
- 没有对匹配到的字符串做计数更新操作
- 子列表处理逻辑错误,没有递归传入子列表本身,反而重复遍历当前列表导致死循环
- 边界判断错误,
pos > len(data)应该改为pos >= len(data),列表下标最大值为len(data)-1 - 参数初始值判断逻辑不完整,只处理了两个参数都为None的情况
正确递归实现代码
def count_strings(data: list, pos=None, result: dict = None) -> dict: """ :param data: 待统计的嵌套列表结构 :param pos: 当前遍历的列表下标位置 :param result: 累计统计结果字典 :return: 字符串为键、对应出现次数为值的统计字典 """ # 初始化参数 if result is None: result = {} if pos is None: pos = 0 # 递归终止条件:当前列表遍历完成 if pos >= len(data): return result current_item = data[pos] if isinstance(current_item, str): # 当前元素是字符串,更新计数 result[current_item] = result.get(current_item, 0) + 1 # 遍历下一个元素 return count_strings(data, pos + 1, result) elif isinstance(current_item, list): # 当前元素是子列表,先递归统计子列表内容 count_strings(current_item, 0, result) # 子列表统计完成后遍历当前列表下一个元素 return count_strings(data, pos + 1, result)
参数作用说明
pos:标记当前正在遍历的列表下标,遍历完当前元素后+1继续递归,直到等于列表长度终止当前层的遍历result:贯穿整个递归过程的统计字典,所有层级的字符串计数都更新到同一个字典对象中,避免重复创建和合并字典的开销
测试用例验证
运行以下测试代码可验证输出符合预期:
# 测试用例1 print(count_strings([[], ["J", "*", "W", "f"], ["j", "g", "*"], ["j", "8", "5", "6", "*"], ["*", "*", "A", "8"]])) # 预期输出:{'J': 1, '*': 5, 'W': 1, 'f': 1, 'j': 2, 'g': 1, '8': 2, '5': 1, '6': 1, 'A': 1} # 测试用例2 print(count_strings([[], [], [], [], ["h", "h", "m"], [], ["m", "m", "M", "m"]])) # 预期输出:{'h': 2, 'm': 4, 'M': 1} # 测试用例3 print(count_strings([])) # 预期输出:{} # 测试用例4 print(count_strings([['a'], 'b', ['a', ['b']]])) # 预期输出:{'a': 2, 'b': 2}
内容的提问来源于stack exchange,提问作者Valhenberg
相关产品推荐
相关产品推荐

