有一个列表如下:
data = ['a', 'c', 'f', 'b', 'f', 'e', 'k', 'd', 'f', 'k']
如何统计每个元素出现的次数呢?
方案一:使用 List count方法
如果只要知道某一个元素出现的次数,直接使用 List count 方法就可以
data = ['a', 'c', 'f', 'b', 'f', 'e', 'k', 'd', 'f', 'k']
res = data.count('f')
print(res)
# 如果要统计所有的元素,也可以循环处理
res = dict()
for d in data:
res[d] = data.count(d)
print(res)
方案二:列表循环,使用字典 dict 统计
更上面的循环一个意思,我们有多种方式处理,核心思想都是使用字典存储结果,对列表进行循环,往字典中赋值。下面几种写法给大家开拓一下思路。
countRes = dict()
for d in data:
if d in countRes:
countRes[d] += 1
else:
countRes[d] = 1
print(countRes)
当然,也可以使用字典的 fromkeys 函数,创建一个新字典
countRes = dict.fromkeys(data, 0)
for d in data:
countRes[d] += 1
print(countRes)
当然,基本同样的思路,也可以使用 collections.defaultdict 统计。
defaultdict(parameter) 接受一个类型参数,例如:int、float、str 等。
传递进来的类型参数,不是用来约束值的类型,更不是约束键的类型,而是当键不存在时,实现一种值的初始化。
from collections import defaultdict
data = ['a', 'c', 'f', 'b', 'f', 'e', 'k', 'd', 'f', 'k']
countRes = defaultdict(int)
for d in data:
countRes[d] += 1
print(countRes)
方案三:使用标准库 collections 模块中的 Counter 对象
Counter 是一个容器对象,使用 collections 模块中的 Counter 类可以实现 hash 对象的统计。
Counter 是一个无序的容器类型,以字典的键值对形式存储,其中元素作为 key,其计数作为 value。计数值可以是任意的 Interger(包括0和负数)。
Counter() 对象还有几个可调用的方法:
- most_common(n) – TOP n 个出现频率最高的元素
- elements – 获取所有的键 通过list转化
- update – 增加对象
- subtrct – 删除对象
- 下标访问 a[‘xx’] --不存在时返回0
所以,我们可以直接把列表传给Counter获取频度结果,如下:
from collections import Counter
res = Counter(data)
print(res)
还有一个问题说明一下,如果需要找到频度最高或者最低的某几个元素,如何处理?
如果使用字典统计的方式,直接根据字典的值对字典中的项进行排序就可以了,具体可以参考我的这篇文章 Python根据字典中值的大小, 对字典中的项排序;如果使用的是 Counter 对象,也可以使用 most_common 函数获取出现频率最高的n个元素。