天天看點

python統計,計數的三種方法統計總結

統計

統計用什麼資料格式

統計的方法:

1. 字典法

2. 哈希表法

3. collections.counter()方法

總結

1. 我們先來說說統計用什麼格式:

我們知道python有清單,字典,元組等等等資料格式,究竟哪種格式比較适合用作統計呢?

現在給出一句詩句: 鵝鵝鵝,曲項向天歌,白毛浮綠水,紅掌撥清波。

# 先看看清單如果用清單,統計大概就是這個樣子:
[['鵝', 3],['曲', 1]...]
           

能看但是不好看。

# 再看看元組,元組的話大概是這樣:
('鵝', 3, '曲', 1...)
           

這樣就不是我們正常人想看的了,會顯得很亂,而且元組隻能看不能改。

# 我們再看看字典格式:
{'鵝': 3, '曲', 1...}
           

這個格式是可以的,字典是能夠明了的看到key 和 value 的對應,是以我們在給一篇文章做統計的時候,我們總是考慮使用字典.

2.統計的方法:

在我們知道用字典的時候,我們該怎樣操作呢?

這時候,就有很多方法了,我剛學的時候就是純字典手寫,後來知道哈希表之後,覺得哈希表也可以,之後看到collections有個counter方法(數數的方法)然後感覺這三種方法都可以。

(1) 字典

# Author:xueling
# 先打開一篇我們要統計的文章,并讀取内容
f = open(r'檔案位址+檔案名', 'r', encoding='utf-8')
article = f.read()
# 建立一個空字典來存儲統計結果
d = {}
# 周遊整篇文章
for i in article:
    d[i] = d.get(i,0) + 1  # 字頻統計
    # 在此基礎上我們還可以做一個排序:
    ls = sorted(list(d.items()), key= lambda x:x[1], reverse=True)
print(d)
f.close()
           

我們用了字典的get方法,代碼意思是 周遊整篇文章。

每遇到一個新字,就将新字填入到字典d裡面,遇到字典已經包含的字就給這個字對應的value + 1

總體方法就是這樣,炒雞簡單。列印一下d:

{'鵝': 3, '曲': 1, '項': 1, '向': 1, '天': 1, '歌': 1, ',': 2, '白': 1, '毛': 1, '浮': 1, '綠': 1, '水': 1, '紅': 1, '掌': 1, '撥': 1, '清': 1, '波': 1, '。': 1}
           

這就是我們想要的結果。

(2)哈希表

首先我們要知道什麼是哈希表,其實哈希表跟字典很像,存儲資料的方式是一樣的都是key:value的鍵值對。

在我們學算法的時候就會學習到哈希表法。

我們想用哈希表,可以通過導collections的包。

# Author:xueling
# 在colletions 導入哈希表的包
from collections import defaultdict
# 打開一個要統計的檔案
f = open(r'檔案路徑+檔案名', 'r', encoding='utf-8')
article = f.read()
# d是通過defaultdict生成的一個哈希表,其中value我們給int型的資料類型,來記錄字元數
d = defaultdict(int)
# article裡每一個字我們把它當做哈希表裡的key,每有一個字就給value + 1,value預設值就是0
for key in article:
    d[key] += 1
print(d)
           

哈希表在很多時候都是很好用的,而且簡單易上手,我們來看一下結果:

defaultdict(<class 'int'>, {'鵝': 3, '曲': 1, '項': 1, '向': 1, '天': 1, '歌': 1, ',': 2, '白': 1, '毛': 1, '浮': 1, '綠': 1, '水': 1, '紅': 1, '掌': 1, '撥': 1, '清': 1, '波': 1, '。': 1})
           

可以說完美。

(3)collections.counter()方法

這個其實也是一樣的,我們用collections裡的counter方法,直接去數數文章裡的字頻。

其實我們一直都是在數中文的文章,但是呢,我們要想去統計英國文章的詞頻該怎麼辦呢?

是以這個方法我們就來試試英國文章的詞頻統計。

我們給英語單詞做統計,首先,我們要想想,怎麼樣才可以讓計算機識别出單詞呢?

英國文章裡每寫一個單詞就要空格,每有一個标點符号,就會把單詞分隔。這是文章特性,是以我們利用這一點去把單詞從文章裡分割出來。

# Author:xueling
import re
import collections
# 打開我們要統計的檔案,并讀取裡面的内容
f = open(r"檔案路徑+檔案名",'r',encoding='utf-8')
txt = f.read()
# 利用正規表達式比對非英文的内容,并用split方法給隔開
ls = re.split(r'\W+',txt)
print(ls)
# 然後用collections.Counter()的方法直接數就行了
col = collections.Counter(ls)
print(col)
# 然後我們在最後看一下最頻繁的10個内容
col_max = col.most_common(10)
print(col_max)
           

我在這裡使用了正則的方法,去比對除了字母,數字,下劃線的内容(也就是比對了英國文章裡面的标點符号和空格,用作之後的切分),用split給分隔并存入ls裡,然後統計ls裡的内容就行了。

原文是這樣的:

Every day is wonderful, if we work hard.
我們拼盡全力,每天都是精彩。
The water of the Yellow River comes from the sky.
黃河之水天上來。
           

結果是這樣的:

ls: ['Every', 'day', 'is', 'wonderful', 'if', 'we', 'work', 'hard', '我們拼盡全力', '每天都是精彩', 'The', 'water', 'of', 'the', 		'Yellow', 'River', 'comes', 'from', 'the', 'sky', '黃河之水天上來', '']

col: Counter({'the': 2, 'Every': 1, 'day': 1, 'is': 1, 'wonderful': 1, 'if': 1, 'we': 1, 'work': 1, 'hard': 1, '我們拼盡全力': 1, '每天	都是精彩': 1, 'The': 1, 'water': 1, 'of': 1, 'Yellow': 1, 'River': 1, 'comes': 1, 'from': 1, 'sky': 1, '黃河之水天上來': 1, '': 1})

col_max: [('the', 2), ('Every', 1), ('day', 1), ('is', 1), ('wonderful', 1), ('if', 1), ('we', 1), ('work', 1), ('hard', 1), ('我們拼盡全力', 1)]
           

col就是我們要的結果。

總結

這就是以上的三種統計我個人比較喜歡的方法,前兩種方法(字典和哈希表)通過簡單的改寫也可以用來統計英國文章的單詞。

第一種方法是最簡單的,是我最經常用的一種方法,很友善快捷,很基礎。

第二種方法用了哈希表,哈希表是算法裡必會的,也挺不錯。

最後一種方法是直接用collections.counter()方法,簡單粗暴,但是在數的時候記得轉成清單形式。

這是我第一篇文章,如果有哪裡寫的不好,希望各位看客外公一定要指出來,指出必改。歡迎大家來評論,分享其他方法。

我是傷病不可救藥(别縮寫)。