如何用Python统计指定字符串列表元素在嵌套列表中的出现次数?
统计嵌套列表中指定元素的出现次数
问题场景
给定嵌套字符串列表和搜索列表:
animal = [[['cat', 'cat', 'dog'], ['cat', 'cat', 'dog'], ['cat', 'cat', 'dog']]] number = ['cat', 'dog']
需要统计number中每个元素在animal里的出现次数,比如'cat'出现6次,'dog'出现3次。
之前尝试的count方法只能处理单层列表,手动写循环只能单个元素统计,效率低下,且转字符串判断的方式存在逻辑错误(会误匹配子串,计数逻辑也不对)。
解决方案
方法1:扁平化列表 + Counter统计
先把多层嵌套列表转成单层,再用collections.Counter一键统计,最后提取目标元素的结果:
from collections import Counter # 递归扁平化嵌套列表 def flatten(nested_list): for item in nested_list: if isinstance(item, list): yield from flatten(item) else: yield item # 初始化数据 animal = [[['cat', 'cat', 'dog'], ['cat', 'cat', 'dog'], ['cat', 'cat', 'dog']]] number = ['cat', 'dog'] # 统计所有元素次数 total_counts = Counter(flatten(animal)) # 筛选出number中的元素结果 result = {key: total_counts[key] for key in number} print(result) # 输出: {'cat': 6, 'dog': 3}
方法2:手动递归遍历计数
如果不想用Counter,可以初始化计数字典,递归遍历嵌套列表时更新对应元素的计数:
animal = [[['cat', 'cat', 'dog'], ['cat', 'cat', 'dog'], ['cat', 'cat', 'dog']]] number = ['cat', 'dog'] # 初始化目标元素的计数,默认0 count_dict = {key: 0 for key in number} # 递归遍历嵌套列表 def count_target_items(lst): for item in lst: if isinstance(item, list): count_target_items(item) else: # 只统计number里的元素 if item in count_dict: count_dict[item] += 1 count_target_items(animal) print(count_dict) # 输出: {'cat': 6, 'dog': 3}
原代码问题说明
你之前写的循环逻辑有两个明显问题:
- 将整个列表转成字符串判断
in,会误匹配子串(比如如果有元素'cattle',也会被认为包含'cat'); - 循环里每次都判断
str(number[0]) in str(animal),这个条件每次都是True,最后得到的是循环次数,不是实际出现次数。
内容的提问来源于stack exchange,提问作者kfnwtfn
相关产品推荐
相关产品推荐

