python中扑克牌类设计_Python中的计数 Counter类
點擊上方"AI機器學習與深度學習算法",選擇"星標"公眾號
原創干貨,第一時間送達
在很多場景中經常會用到統計計數的需求,比如在實現 kNN 算法時統計 k 個標簽值的個數,進而找出標簽個數最多的標簽值作為最終 kNN 算法的預測結果。Python內建的 collections 集合模塊中的 Counter 類能夠簡潔、高效的實現統計計數。
Counter 是 dict 字典的子類,Counter 擁有類似字典的 key 鍵和 value 值,只不過 Counter 中的鍵為待計數的元素,而 value 值為對應元素出現的次數 count,為了方便介紹統一使用元素和 count 計數來表示。雖然 Counter 中的 count 表示的是計數,但是 Counter 允許 count 的值為 0 或者負值。
實例化 Counter 類
如果要使用 Counter,必須要進行實例化,在實例化的同時可以為構造函數傳入參數來指定不同類型的元素來源。
from?collections?import?Counter#?實例化元素為空的?Counter?對象
a?=?Counter()
#?從可迭代對象中實例化?Counter?對象
b?=?Counter('chenkc')
#?從?mapping?中實例化?Counter?對象
c?=?Counter({'a':1,?'b':2,?'c':3})
#?從關鍵詞參數中實例化?Counter?對象
d?=?Counter(a?=?1,?b?=?2,?c?=?3)
- 實例化元素為空的 Counter 對象,之后可以通過為字典添加元素的方式為 Counter 對象添加元素。
#?實例化元素為空的?Counter
a?=?Counter()
#?為?Counter?添加元素以及對應的?count?計數
a['a']?=?1
a['b']?=?2
a['c']?=?3
>>>?print(a)
Counter({'c':?3,?'b':?2,?'a':?1})
- 從 string(字符為list列表的元素)、list 和 tuple 這些可迭代對象中獲取元素。
#?從可迭代對象中實例化?Counter
b?=?Counter("chenkc")?#?string
b2?=?Counter(['c',?'h',?'e',?'n',?'k',?'c'])?#?list
b3?=?Counter(('c',?'h',?'e',?'n',?'k',?'c'))?#?tuple
>>>?print(b)
Counter({'c':?2,?'h':?1,?'e':?1,?'n':?1,?'k':?1})
>>>?print(b2)
Counter({'c':?2,?'h':?1,?'e':?1,?'n':?1,?'k':?1})
>>>?print(b3)
Counter({'c':?2,?'h':?1,?'e':?1,?'n':?1,?'k':?1})
- 從 mapping 中實例化 Counter 對象,mapping 類型的數據就是元素為(x, y)的列表,字典也屬于 mapping 類型的數據。
#?從?mapping?中實例化?Counter?對象
c?=?Counter([('a',?1),?('b',?2),?('a',?3),?('c',?3)])
c2?=?Counter({'a':1,?'b':2,?'a':3,?'c':3})?#?字典
>>>?print(c)
Counter({('a',?1):?1,?('b',?2):?1,?('a',?3):?1,?('c',?3):?1})?
>>>?print(c2)
Counter({'a':?3,?'c':?3,?'b':?2})
雖然傳入的 mapping 類型的數據是一樣的,但是由于字典中的鍵是唯一的,因此如果字典中的鍵重復會保留最后一個。
dic?=?{'a':1,?'b':2,?'a':3,?'c':3}>>>?print(dic)
{'a':?3,?'b':?2,?'c':?3}
- 從關鍵詞參數中實例化 Counter 對象,關鍵詞參數中指定的關鍵詞必須是唯一的,但是不同于字典,如果指定的關鍵詞重復,程序會拋出SyntaxError異常。
#?從關鍵詞參數中實例化?Counter?對象
d?=?Counter(a?=?1,?b?=?2,?c?=?3)
#?d2?=?Counter(a?=?1,?b?=?2,?a?=?3,?c?=?3)?#?SyntaxError
>>>?print(d)
Counter({'c':?3,?'b':?2,?'a':?1})
我們都知道在字典中查找不存在的鍵,程序會拋出 KyeError的異常,但是由于 Counter 用于統計計數,因此 Counter 不同于字典,如果在 Counter 中查找一個不存在的元素,不會產生異常,而是會返回 0,這其實很好理解,Counter 計數將不存在元素的 count 值設置為 0 。
from?collections?import?Counterc?=?Counter({'a':1,?'b':2,?'c':3})
>>>?print(c['d'])?#?查找鍵值為'd'對應的計數
0
>>>?print(c)
Counter({'c':?3,?'b':?2,?'a':?1})
c['d']表示的查找返回元素值為d的 count 計數,而如果使用c['d'] = 0則表示的是為 Counter 添加元素。
from?collections?import?Counterc?=?Counter({'a':1,?'b':2,?'c':3})
c['d']?=?4?#?為?Counter?添加元素
>>>?print(c['d'])
4
>>>?print(c)
Counter({'d':?4,?'c':?3,?'b':?2,?'a':?1})
Counter 中的方法
實例化 Counter 類對象之后,就可以使用 Counter 對象中的方法。由于 Counter 類繼承自 dict 類,所以 Counter 類可以使用 dict 類的方法。下面分別從 Counter 所特有的方法和一些字典的常規方法來介紹。
Counter 特有的方法
Counter 額外支持字典中沒有的三個方法:elements()、most_common([m])以及subtract([iterable-or-mapping])。
- elements 方法
elements()方法返回一個迭代器,可以通過 list 或者其它方法將迭代器中的元素輸出,輸出的結果為對應出現次數的元素。
from?collections?import?Counterc?=?Counter({'a':1,?'b':2,?'c':3})
c2?=?Counter({'a':0,?'b':-1,?'c':3})?#?將出現次數設置為?0?和負值
>>>?print(c.elements())
0x0000022A57509B70>?>>>?print(list(c.elements()))
['a',?'b',?'b',?'c',?'c',?'c']?>>>?print(c2.elements())0x0000022A57509B70>?>>>?print(list(c2.elements()))
['c',?'c',?'c']
在 Counter 中是允許計數為 0 或者負值的,不過通過上面代碼可以看出 elements 函數沒有將 0 和負值對應的元素值打印出來。
- most_common 方法
most_common([n])是 Counter 最常用的方法,返回一個出現次數從大到小的前 n 個元素的列表。
from?collections?import?Counterc?=?Counter({'a':1,?'b':2,?'c':3})
>>>?print(c.most_common())?#?默認參數
[('c',?3),?('b',?2),?('a',?1)]
>>>?print(c.most_common(2))?#?n?=?2
?[('c',?3),?('b',?2)]?
>>>?print(c.most_common(3))?#?n?=?3
[('c',?3),?('b',?2),?('a',?1)]?
>>>?print(c.most_common(-1))?#?n?=?-1
[]
n為可選參數,通過上面的代碼可以總結出:
- subtract 方法
subtract([iterable_or_mapping])方法其實就是將兩個 Counter 對象中的元素對應的計數相減。
from?collections?import?Counterc?=?Counter({'a':1,?'b':2,?'c':3})
d?=?Counter({'a':1,?'b':3,?'c':2,?'d':2})
c.subtract(d)
>>>?print(c)
Counter({'c':?1,?'a':?0,?'b':?-1,?'d':?-2})
其實就是兩個 Counter 中的對應的元素的計數相減。當其中某個 Counter 中對應的元素不存在的時候,默認將其計數設置為 0,這也是為什么'd'的計數為-2的原因。
Counter 支持的字典方法
一般常規的字典方法對 Counter 對象都是有效的,將這些字典方法作用到下面的 Counter 對象c中,并繪制到下面的表格中。
from?collections?import?Counterc?=?Counter({'a':1,?'b':2,?'c':3,?'d':0,?'e':-1})
| c.values() | 列出所有的元素的計數 | dict_values([1, 2, 3, 0, -1]) |
| c.clear() | 清空所有元素 | Counter() # 元素為空的 Counter |
| list(c) | 列出所有不唯一的元素 | ['a', 'b', 'c', 'd', 'e'] |
| set(c) | 轉換成集合 | {'d', 'b', 'c', 'a', 'e'} |
| dict(c) | 轉換成字典 | {'a': 1, 'b': 2, 'c': 3, 'd': 0, 'e': -1} |
| c.items() | 轉換成dict_items,其中的元素為(key, vlaue) | dict_items([('a', 1), ('b', 2), ('c', 3), ('d', 0), ('e', -1)]) |
| c.most_common()[:-n-1:-1] | n 個出現次數最小的元素 | [('e', -1), ('d', 0)] # 當 n = 2 時 |
| c += Counter() | 刪除掉計數為 0 和復數的元素 | Counter({'c': 3, 'b': 2, 'a': 1}) |
但是在 Counter 中有兩個方法和字典中的使用有些區別:
| fromkeys(iterable) | 沒有為 Counter 對象實現該函數 |
| update([iterable-or-mapping]) | 增加 count 而不是用新的 count 取代舊的 count |
c?=?Counter({'a':1,?'b':2,?'c':3,?'d':0,?'e':-1})
c.update({'a':2,?'d':2,?'e':1})
>>>?print(c)
Counter({'a':?3,?'c':?3,?'b':?2,?'d':?2,?'e':?0})
對于 Counter 中的update函數簡單來說,就是增加對應元素的計數。
集合運算符
這里直接貼出集合運算符的代碼示例。
>>>?c?=?Counter(a=3,?b=1)>>>?d?=?Counter(a=1,?b=2)
>>>?c?+?d???????????????????????????#?add?two?counters?together:??c[x]?+?d[x]
Counter({'a':?4,?'b':?3})
>>>?c?-?d???????????????????????????#?subtract?(keeping?only?positive?counts)
Counter({'a':?2})
>>>?c?&?d???????????????????????????#?intersection:??min(c[x],?d[x])
Counter({'a':?1,?'b':?1})
>>>?c?|?d???????????????????????????#?union:??max(c[x],?d[x])
Counter({'a':?3,?'b':?2})
參考:
https://blog.csdn.net/Shiroh_ms08/article/details/52653385
推薦閱讀
(點擊標題可跳轉閱讀)
【自然語言處理】帶你理解語言模型
【自然語言處理】通俗理解n-gram語言模型
【自然語言處理】通俗講解語言模型的評價指標-困惑度
【Python語言】輕松搞懂Python中Iterable與Iterator
【機器學習】一文搞懂簡單線性回歸
【深度學習】詳解Softmax函數
【技術干貨】本地遠程訪問Linux服務器上的jupyter notebook
【數據分析】Numpy中常用隨機函數的總結
總結
以上是生活随笔為你收集整理的python中扑克牌类设计_Python中的计数 Counter类的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: mysql 读取文件_关于mysql:逐
- 下一篇: qt 通过类实现画图_QT案例IDE编写