在Python日常开发中,列表是最常用的数据容器,经常需要统计元素总数、特定值出现次数或满足条件的元素个数。本文整理6种主流方案,从内置函数到标准库,再到生成器表达式,覆盖常见业务场景,附带代码示例和性能说明。
一、获取列表总长度:len()
内置函数len()直接返回容器内元素的个数,只统计最外层一级。- arr = [10, 20, 30, "python", True]
- print(len(arr)) # 输出5
- # 嵌套列表只统计外层
- nest_arr = [[0,0], [1,2], 99]
- print(len(nest_arr)) # 输出3
复制代码 适用:需要知道列表总元素数量,不筛选类型。
二、统计指定元素出现次数:list.count()
实例方法count()精准匹配给定值,支持数字、字符串、布尔、子列表等可等值比较的元素。- data = [1, 0, 0, 1, 0, 5]
- print(data.count(0)) # 输出3
- # 统计子列表 [0,0] 数量
- data2 = [[15, 0], [0, 0], [0, 0], [1, 1]]
- print(data2.count([0,0])) # 输出2
复制代码 优点:一行代码极简;缺点:只能匹配固定值,不能做范围或多条件筛选。
三、条件过滤统计:sum() + 生成器表达式(推荐高性能)
当需要自定义条件(如大于某数、子列表匹配、模糊匹配)时,使用 sum(1 for x in lst if condition) 遍历一次完成统计,不产生中间列表,内存占用低。- nums = [1, 5, 2, 8, 3, 10]
- count = sum(1 for x in nums if x > 3)
- print(count) # 输出3
- # 统计嵌套列表中 [0,0] 子列表
- lst = [[15, 0], [0, 0], [0, 0], [1, 1]]
- count2 = sum(1 for item in lst if item == [0, 0])
- print(count2) # 输出2
- # 切片后统计前i个元素中0的个数
- d = [0,1,2,3,4,5]
- i = 3
- zero_num = sum(1 for x in d[:i] if x == 0)
- print(zero_num) # 输出1
复制代码 适用:数据量大或需要复杂条件时,性能优秀。
四、列表推导式 + len()
先过滤出符合条件的元素生成新列表,再取长度。逻辑直观,适合初学者。- data = [2, 0, 0, 6, 0]
- zero_list = [x for x in data if x == 0]
- print(len(zero_list)) # 输出3
复制代码 缺点:会创建临时列表,百万级以上数据应改用生成器方案。
五、手动循环计数
当判断逻辑非常复杂(如需要中间运算、日志打印、分支判断)时,for循环加计数器的灵活性最高。- lst = [[15, 0], [0, 0], [0, 0], [1, 1]]
- count = 0
- for item in lst:
- if item == [0, 0]: # 可插入任意复杂逻辑
- count += 1
- print(count) # 输出2
复制代码 适用:多层判断或需在循环内执行额外操作。
六、一次性统计所有元素频次:collections.Counter
标准库Counter可快速生成元素频次字典,适合多元素批量统计。注意元素需可哈希(数字、字符串、元组),子列表不可用。- from collections import Counter
- data = [0, 0, 1, 2, 0, 2, 5]
- counter = Counter(data)
- print(counter[0]) # 输出3
- print(counter[2]) # 输出2
- print(counter) # Counter({0: 3, 2: 2, 1: 1, 5: 1})
复制代码 扩展:若需统计嵌套子列表频次,应改用count()或sum生成器。
七、方法对比与场景速查
- 列表总长度 → len()
- 固定值精准计数 → list.count()
- 条件筛选(高性能) → sum(1 for x in lst if 条件)
- 新手简单过滤 → 列表推导式 + len()
- 复杂逻辑 → for循环手动计数
- 全局频次统计 → collections.Counter
八、常见踩坑
1. len()不递归嵌套列表,只返回外层元素个数。
2. count()使用严格等值匹配,[0]和(0,)不等,不能互计。
3. Counter只接受可哈希元素,列表和字典作为元素会触发TypeError。
4. 大数据量避免列表推导式产生中间列表,优先生成器表达式节省内存。
以上方法覆盖了Python列表计数的全部主流场景,实际开发中可根据数据规模、逻辑复杂度灵活选用。文中示例均可在真实项目中直接复用。 |