2

Python编程:集合工具类之计数器(Counter)详解与实践

 1 year ago
source link: https://www.51cto.com/article/721707.html
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.

Python编程:集合工具类之计数器(Counter)详解与实践

作者:传新视界 2022-11-01 07:54:18
本篇文章主要介绍了Python内置集合模块的工具类Counter的使用,并结合代码和描述,以期深入浅出的帮助你更好的理解和掌握Counter相关内容和应用。

本文继续来盘Python内置集合模块,这期主要介绍其中的工具类计数器类(Counter)类的使用。我们还是采用“短平快”的模式——文字+代码,助你多快好省的学会它,并能都收用上它。闲话少叙,开始正文——

 Counter

Counter是一个dict子类,用于计数可哈希对象。它是一个集合,其中元素被存储为字典键,它们的计数值被存储为字典值。计数值可为任何整数值,包括零或负计数。Counter类类似于其他语言中的包或多集。

计数的元素来自可迭代对象或另一个初始化的映射(或计数器)。下面是Python中创建Counter对象的一些方式。请看示例代码:

from collections import Counter

# 创建一个空的Counter对象
c1 = Counter()
print(c1)

# 从可迭代对象创建新的Counter对象
c2 = Counter('aabbbcddeeee')
print(c2)

# 从映射创建新的的Counter对象
c3 = Counter({'orange': 6, 'red': 3, 'green': 5})
print(c3)

# 从关键字参数创建Counter对象
c4 = Counter(cats=4, dogs=8)
print(c4)

程序运行结果如下所示:

Counter()
Counter({'e': 4, 'b': 3, 'a': 2, 'd': 2, 'c': 1})
Counter({'orange': 6, 'green': 5, 'red': 3})
Counter({'dogs': 8, 'cats': 4})

Counter对象有一个字典接口,只是它们会为丢失的项返回一个零计数,而不是引发KeyError,示例如下:

# 存在元素计算
c5 = Counter(['eggs', 'ham', 'jar ', 'ham'])
print(c5['ham'])

# 缺失元素计数为0
print(c5['bacon'])

输出结果如下:

2
0

从Counter中删除元素

要从Counter中删除元素,可以使用del关键字。请记住,将计数设置为零并不会从计数器中删除一个元素。请看示例代码:

# –从Counter对象删除元素 – #
# 0计数的counter条目项
c5['sausage'] = 0
print(c5)

# del 实际删除条目项
del c5['sausage']
print(c5)

输出结果为:

Counter({'ham': 2, 'eggs': 1, 'jar ': 1, 'sausage': 0})
Counter({'ham': 2, 'eggs': 1, 'jar ': 1})

如代码所示,我们将0设置为计数器中不存在的项。Python将该项以零值添加到Counter中。在第7行中,我们使用del关键字完全删除该项。很明显,计数为0,并不会删除Counter中的计数项,而要删除之,得用del命令才行。

Counter方法

Counter对象除了支持所有字典可用的方法之外,以下是其特有最常见方法:返回一个迭

1)elements():

返回迭代器,其为重复相应元素次数与其计数值相等的迭代器。按第一次遇到的顺序返回元素。如果一个元素的计数小于1,elements()将忽略它。示例如下:

# – Counter 对象方法 – #
# elements()
counter = Counter(a=1, b=2, c=0, d=-2, e=4)
sorted_elements = sorted(counter.elements())
print(sorted_elements)

输出结果为:

['a', 'b', 'b', 'e', 'e', 'e', 'e']

2)most_common([n]):

返回n个最常见元素的列表,元素的计数大小从最大到最小。如果省略n或None, most_common()将返回计数器中的所有元素。计数相等的元素按第一次遇到的顺序排列:

# 2)most_common()
most_common_3 = Counter('abracadabrae').most_common(3)
print(most_common_3)

输出结果为:

[('a', 5), ('b', 2), ('r', 2)]

3)subtract([iterable-or-mapping]):

从可迭代对象或另一个映射(或计数器)中减去元素。像dict.update(),但是减去计数而不是替换它们。输入和输出都可能是零或负的。示例如下:

# 3)subtract()
c_1 = Counter(a=4, b=2, c=0, d=-2)
c_2 = Counter(a=1, b=2, c=3, d=4)
c_1.subtract(c_2)
print(c_1)

输出结果如下:

[('a', 5), ('b', 2), ('r', 2)]

4)两个方法

通常的字典方法可用于Counter对象,但有两个方法针对计数器的工作方式不同:

fromkeys(iterable):

这个类方法Counter对象没实现。

update([iterable-or-mapping]):

从可迭代对象中计数元素,或从另一个映射(或计数器)中添加元素。类似dict.update(),但Counter是增加计数而不是替换它们。而且,迭代对象应该是元素序列,而不是(键,值)对的序列。示例如下:

# 4)update()
d = Counter(a=3, b=1)
d.update({'a': 5, 'c': 4})
print(d)
d.update('aBac')
print(d)
d.update(dict([('a',10),('e',9)]))
print(d)
#但不要这样:
d.update([('a',10),('e',9)])
print(d)

请注意下面的输出结果:

Counter({'a': 8, 'c': 4, 'b': 1})

Counter({'a': 10, 'c': 5, 'b': 1, 'B': 1})

Counter({'a': 20, 'e': 9, 'c': 5, 'b': 1, 'B': 1})

Counter({'a': 20, 'e': 9, 'c': 5, 'b': 1, 'B': 1, ('a', 10): 1, ('e', 9): 1})

1.1.1 数学式操作

Counter提供了几种数学操作来组合Counter对象运算,以生成多集(计数大于零的计数器)。加减法通过加减相应元素的计数来合并计数器。交集和并集返回对应计数的最小值和最大值。每个操作都可以接受带符号计数值的输入,但输出将排除计数为零或更少的结果。

c = Counter(a=3, b=1)
d = Counter(a=1, b=2)
print(c + d)
print(c - d)
print(c & d)
print(c | d )

输出结果类似如下:

Counter({'a': 4, 'b': 3})
Counter({'a': 2})
Counter({'a': 1, 'b': 1})
Counter({'a': 3, 'b': 2})

一元加减法是与空计数器相加或与空计数器相减的快捷方式。示例如下:

#一元加减
c = Counter(a=2, b=-4)
print(+c)# 一元加
print(-c)# 一元减

输出结果如下:

Counter({'a': 2})
Counter({'b': 4})

简而言之,可利用Counter对象实现一些相关数据的统计分析。

本篇文章主要介绍了Python内置集合模块的工具类Counter的使用,并结合代码和描述,以期深入浅出的帮助你更好的理解和掌握Counter相关内容和应用。若是初学者,记得一定要动手实践一把才是最佳学习模式。


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK