现在我们假如有一个列表,需要统计其中每种元素出现的次数,我们可以这样写
lis1 = ['a','b','c','a','c','a','a','b','c']
result = {}
for i in lis1:
if i in result:
result[i] += 1
else:
result[i] = 1
print(result)
out:
{'a': 4, 'b': 2, 'c': 3}
如果用collections模块提供的setdefault()函数,可以简化这一过程
import collections as col
result = {}
for i in lis1:
result.setdefault(i, 0)
result[i] += 1
print(result)
out:
{'a': 4, 'b': 2, 'c': 3}
其中的setdefault()函数可以接受一个key(即代码中的 i),如果字典中不存在这个key,就会创建这个键并设置值(也就是代码中i后面的0);如果存在这个键,则返回这个键原先对应的值。
我们再通过defaultdic()函数继续优化
result = col.defaultdict(int)
for i in lis1:
result[i] += 1
print(result)
out:
defaultdict(<class 'int'>, {'a': 4, 'b': 2, 'c': 3})
这里defaultdict()相当于当键不存在时,返回默认值0;键存在则返回原来的键对应的值。
同时注意到我们传入了一个参数int,他代表返回0,而还有其他的参数如 str list set等等,有待研究,可以参考下面这篇文章
https://www.pythontab.com/html/2013/pythonjichu_1023/594.html
最后,如果使用collections中的counter类,只需要一行代码
cout = col.Counter(lis1)
print(cout)
out:
Counter({'a': 4, 'c': 3, 'b': 2})
Counter类是字典的一个子类,也是以键值对储存,但是它和字典的区别在于counter的值储存的是键出现的次数,因此counter主要是用来进行跟踪元素出现的次数