求更高效/Pythonic实现方式:统计元素在子列表中的出现次数
更高效且Pythonic的实现方案
原代码的核心问题是重复遍历子列表:对每个唯一元素,都要检查所有子列表是否包含它,当数据规模较大时,时间效率会显著降低。下面提供几种更优的实现方式,既符合Python风格,又能大幅提升效率:
方案1:使用collections.Counter(最简洁)
利用标准库的Counter工具,只需遍历一次所有子列表,对每个子列表的唯一元素进行计数更新:
from collections import Counter l = [[0,0],[1,0],[4,5,1],[2,3,5],[0,4]] count_dict = Counter() for sublist in l: # 对子列表去重,避免同一子列表内的重复元素重复计数 count_dict.update(set(sublist)) # 若需要普通dict类型,可转换:dict(count_dict) print(count_dict) # 输出: Counter({0: 3, 1: 2, 4: 2, 5: 2, 2: 1, 3: 1})
方案2:使用collections.defaultdict(灵活可控)
如果需要更灵活的计数逻辑,defaultdict是不错的选择:
from collections import defaultdict l = [[0,0],[1,0],[4,5,1],[2,3,5],[0,4]] count_dict = defaultdict(int) for sublist in l: unique_items = set(sublist) for item in unique_items: count_dict[item] += 1 # 转换为普通dict(可选) count_dict = dict(count_dict) print(count_dict) # 输出: {0: 3, 1: 2, 4: 2, 5: 2, 2: 1, 3: 1}
方案3:不依赖标准库(纯基础实现)
如果不想导入任何库,用普通字典也能实现高效计数:
l = [[0,0],[1,0],[4,5,1],[2,3,5],[0,4]] count_dict = {} for sublist in l: for item in set(sublist): # 用get方法处理键不存在的情况,默认值为0 count_dict[item] = count_dict.get(item, 0) + 1 print(count_dict) # 输出: {0: 3, 1: 2, 4: 2, 5: 2, 2: 1, 3: 1}
优势对比
- 时间效率:新方案只遍历所有子列表一次,总时间复杂度为
O(T)(T是所有子列表的元素总数);原方案时间复杂度为O(E*S)(E是唯一元素数,S是子列表数),数据量越大,新方案的优势越明显。 - 可读性:代码逻辑直观,避免了原代码中嵌套列表推导式的晦涩感,同时去掉了不必要的中间变量。
- Pythonic:充分利用Python标准库的工具特性,代码简洁优雅,符合社区惯用写法。
内容的提问来源于stack exchange,提问作者Eric
相关产品推荐
相关产品推荐

