查看: 110|回复: 3

Python列表元素统计的6种方法:len/count/Counter

[复制链接]
发表于 1 小时前 | 显示全部楼层 |阅读模式
在Python日常开发中,列表是最常用的数据容器,经常需要统计元素总数、特定值出现次数或满足条件的元素个数。本文整理6种主流方案,从内置函数到标准库,再到生成器表达式,覆盖常见业务场景,附带代码示例和性能说明。

一、获取列表总长度:len()
内置函数len()直接返回容器内元素的个数,只统计最外层一级。
  1. arr = [10, 20, 30, "python", True]
  2. print(len(arr))  # 输出5
  3. # 嵌套列表只统计外层
  4. nest_arr = [[0,0], [1,2], 99]
  5. print(len(nest_arr))  # 输出3
复制代码
适用:需要知道列表总元素数量,不筛选类型。

二、统计指定元素出现次数:list.count()
实例方法count()精准匹配给定值,支持数字、字符串、布尔、子列表等可等值比较的元素。
  1. data = [1, 0, 0, 1, 0, 5]
  2. print(data.count(0))  # 输出3
  3. # 统计子列表 [0,0] 数量
  4. data2 = [[15, 0], [0, 0], [0, 0], [1, 1]]
  5. print(data2.count([0,0]))  # 输出2
复制代码
优点:一行代码极简;缺点:只能匹配固定值,不能做范围或多条件筛选。

三、条件过滤统计:sum() + 生成器表达式(推荐高性能)
当需要自定义条件(如大于某数、子列表匹配、模糊匹配)时,使用 sum(1 for x in lst if condition) 遍历一次完成统计,不产生中间列表,内存占用低。
  1. nums = [1, 5, 2, 8, 3, 10]
  2. count = sum(1 for x in nums if x > 3)
  3. print(count)  # 输出3
  4. # 统计嵌套列表中 [0,0] 子列表
  5. lst = [[15, 0], [0, 0], [0, 0], [1, 1]]
  6. count2 = sum(1 for item in lst if item == [0, 0])
  7. print(count2)  # 输出2
  8. # 切片后统计前i个元素中0的个数
  9. d = [0,1,2,3,4,5]
  10. i = 3
  11. zero_num = sum(1 for x in d[:i] if x == 0)
  12. print(zero_num)  # 输出1
复制代码
适用:数据量大或需要复杂条件时,性能优秀。

四、列表推导式 + len()
先过滤出符合条件的元素生成新列表,再取长度。逻辑直观,适合初学者。
  1. data = [2, 0, 0, 6, 0]
  2. zero_list = [x for x in data if x == 0]
  3. print(len(zero_list))  # 输出3
复制代码
缺点:会创建临时列表,百万级以上数据应改用生成器方案。

五、手动循环计数
当判断逻辑非常复杂(如需要中间运算、日志打印、分支判断)时,for循环加计数器的灵活性最高。
  1. lst = [[15, 0], [0, 0], [0, 0], [1, 1]]
  2. count = 0
  3. for item in lst:
  4.     if item == [0, 0]:  # 可插入任意复杂逻辑
  5.         count += 1
  6. print(count)  # 输出2
复制代码
适用:多层判断或需在循环内执行额外操作。

六、一次性统计所有元素频次:collections.Counter
标准库Counter可快速生成元素频次字典,适合多元素批量统计。注意元素需可哈希(数字、字符串、元组),子列表不可用。
  1. from collections import Counter
  2. data = [0, 0, 1, 2, 0, 2, 5]
  3. counter = Counter(data)
  4. print(counter[0])  # 输出3
  5. print(counter[2])  # 输出2
  6. 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列表计数的全部主流场景,实际开发中可根据数据规模、逻辑复杂度灵活选用。文中示例均可在真实项目中直接复用。
回复

使用道具 举报

发表于 1 小时前 | 显示全部楼层

Re: Python列表元素统计的6种方法:len/count/Counter

非常清晰实用的总结!感谢分享。我平时最常用的是 `sum(1 for x in lst if condition)` 生成器方式,确实在大数据量下内存友好。想请教一下,如果在统计的同时还需要记录符合条件的元素本身(比如保存到另一个列表),是不是只能先用列表推导式,或者循环手动追加到新列表?有没有办法一次遍历同时完成统计和收集?
回复 支持 反对

使用道具 举报

发表于 1 小时前 | 显示全部楼层

Re: Python列表元素统计的6种方法:len/count/Counter

楼主整理得很全面,从最基础的 `len()` 到 `Counter` 都覆盖了,而且每个方法都配了场景说明和避坑提示,非常实用。我个人平时最常用的是 `sum(1 for x in lst if cond)` 这种生成器写法,确实在大数据量下性能好,又灵活。另外补充一个小点:如果只是统计列表里满足条件的元素个数,用 `sum` + 生成器还能结合 `itertools.islice` 做切片统计,楼主文中用切片 `d[:i]` 也演示了这个思路。感谢分享,已收藏备用。
回复 支持 反对

使用道具 举报

发表于 1 小时前 | 显示全部楼层

Re: Python列表元素统计的6种方法:len/count/Counter

感谢分享!整理得非常清晰,从基础到进阶都覆盖了,代码示例也很直观。平时我主要用 `sum` + 生成器做条件统计,确实省内存;`Counter` 在批量统计时很方便,没注意过可哈希的限制,你这个提醒很及时。另外想问下,对于嵌套列表的深层元素(比如多层嵌套)有没有特别高效的统计方式?还是在需要时自己写递归?
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

指导单位

江苏省公安厅

江苏省通信管理局

浙江省台州刑侦支队

DEFCON GROUP 86025

Hacking Group 021A

旗下站点

态势感知中心

应急响应中心

红盟安全

联系我们

官方QQ群:112851260

官方邮箱:security#ihonker.org(#改成@)

官方核心成员

关注微信公众号

Archiver|手机版|小黑屋| ( 沪ICP备2021026908号 )

GMT+8, 2026-7-11 18:27 , Processed in 0.029345 second(s), 18 queries , Gzip On, Redis On.

Powered by ihonker.com

Copyright © 2015-现在.

  • 返回顶部