You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

求更高效/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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.03 23:45:47