HOWTO · Python
Python 中计算列表中元素的数量
本教程演示了如何在 Python 中对列表中的元素进行计数。
本页内容
“统计列表中的元素”可能指三种不同的任务,Python 为每种任务都提供了直接工具。需要元素总数时使用 len(),需要统计单个值出现的次数时使用 list.count(),需要一次性获得每个值的频率时使用 collections 模块中的 Counter。使用字典的手动循环可以构建相同的频率结果,并清楚展示计数的具体过程。本教程通过可运行示例逐一介绍每种方法,帮助你选择与任务匹配的方式。
使用 len() 获取元素总数
内置的 len() 函数返回列表中顶层元素的数量。它适用于任何元素类型——数字、字符串、布尔值,甚至其他列表——因为它测量的是列表本身,而不是其中的值。
运行以下示例:
本节中的代码以及显示的标签或输出仍为英文。
items = [10, "apple", 3.14, [1, 2, 3]]
print(len(items))
4
这个列表包含四个元素:一个整数、一个字符串、一个浮点数和一个嵌套列表。len() 返回 4,因为嵌套列表 [1, 2, 3] 在外层只算作一个元素。如果需要把嵌套列表中的元素也计入,请先展平结构,或者分别累加内部列表的长度——len() 不会越过顶层继续统计。
使用 list.count() 统计某个值出现的次数
list.count() 方法返回给定值在列表中出现的次数。传入要查找的值,它会为你扫描列表:
本节中的代码以及显示的标签或输出仍为英文。
my_list = [1, 2, 3, 2, 1, 4, 2]
print(my_list.count(2))
print(my_list.count(9))
3
0
值 2 出现了三次,而 9 从未出现,因此第二次调用返回 0。list.count() 适用于列表可以包含的任何元素类型,包括字符串和混合数据。
需要注意两个限制。每次调用只能回答关于一个值的问题,所以统计三个不同的值需要分别调用三次——如果需要完整的频率分布,请改用 Counter 或循环。对于嵌套列表,list.count() 只会匹配与你传入的值相等的整个元素;除非先展平列表,否则存储在嵌套列表中的值不会被看到。
使用 Counter 统计每个值
collections 模块中的 Counter 类会在一次遍历中为每个值构建频率映射。它的行为类似于一个将每个元素映射到其计数的字典:
本节中的代码以及显示的标签或输出仍为英文。
from collections import Counter
my_list = [1, 2, 3, 2, 1, 4, 2]
element_count = Counter(my_list)
print(element_count)
print(element_count[2])
print(element_count[9])
Counter({2: 3, 1: 2, 3: 1, 4: 1})
3
0
对 Counter 进行索引的方式与字典类似,但有一个有用的区别:读取从未被计数的键时会返回 0,而不是引发错误,因此 element_count[9] 可以安全地输出 0。
由于每个值在内部都会成为字典键,所有元素都必须是可哈希的。整数、字符串和元组符合要求;嵌套列表则不符合。对于包含不可哈希元素的列表,请先将其转换为可哈希的形式,或者使用其他方法计数。
使用循环构建频率字典
普通的循环配合字典可以生成相同的频率,并让计数机制清晰可见。先初始化一个字典,然后在遍历列表时递增每个元素的计数:
本节中的代码以及显示的标签或输出仍为英文。
my_list = [1, 2, 3, 2, 1, 4, 2]
element_count = {}
for element in my_list:
if element in element_count:
element_count[element] += 1
else:
element_count[element] = 1
print(element_count)
{1: 2, 2: 3, 3: 1, 4: 1}
结果将每个值映射到其计数:2 出现了三次,1 出现了两次,3 和 4 各出现一次。这个模式只需遍历列表一次,并让你拥有完全的控制权——可以在计数前转换每个元素、跳过选定的值,或者累计普通计数之外的其他内容。同样的可哈希约束也适用:每个元素都会成为字典键,因此必须先转换或展平诸如嵌套列表之类的不可哈希元素。
在这些工具之间进行选择时,让方法与问题相匹配。需要元素总数时使用 len(),统计单个值时使用 list.count(),需要完整的频率映射时使用 Counter 或字典循环。