官术网_书友最值得收藏!

3.1.4 序列元素統(tǒng)計

在工作過程中,我們經(jīng)常需要找到一個序列中某個出現(xiàn)次數(shù)最多的字符或數(shù)字。在Python中是否有函數(shù)支持快速尋找字符或數(shù)字呢?

collections.Counter類就是專門針對這類問題而設計的,甚至使用most_common()方法即可直接獲取答案。

假設要從一個單詞列表中找出哪個單詞出現(xiàn)頻率最高,代碼(most_times_exp.py)示例如下:


from collections import Counter
words = [
    'python', 'c++', 'abc', 'php', 'mysql', 'java', 'c#', '.net',
    'ruby', 'lisp', 'python', 'python', 'mongodb', 'hive', 'spark', 'go', 'vb',
    'java', "python", 'c', 'ios', 'sql', 'python', 'java', 'c++',
    'hbase', 'go', "java", 'c++'
]
word_counts = Counter(words)
frequency_num = 2
# 出現(xiàn)頻率最高的 frequency_num 個單詞
top_three = word_counts.most_common(frequency_num)
print(f'出現(xiàn)頻率最高的{frequency_num}個單詞是:{top_three}')

執(zhí)行py文件,輸出結(jié)果如下:


出現(xiàn)頻率最高的2個單詞是:[('python', 5), ('java', 4)]

作為輸入,Counter對象可以接收任意由可哈希(Hashable)元素構(gòu)成的序列對象。在底層實現(xiàn)上,一個Counter對象就是一個字典——一個將元素映射為它出現(xiàn)的次數(shù)上的字典,示例如下:


print(f"python出現(xiàn)頻率:{word_counts['python']}")
print(f"go出現(xiàn)頻率:{word_counts['go']}")

如果想手動增加計數(shù),可以簡單地使用加法,示例如下:


more_words = ['python','java','go']
for word in more_words:
    word_counts[word] += 1

print(f"python出現(xiàn)頻率:{word_counts['python']}")
print(f"go出現(xiàn)頻率:{word_counts['go']}")

或者可以使用update()方法,示例如下:


word_counts.update(more_words)

Counter實例的一個鮮為人知的特性是它可以很容易地與數(shù)學運算操作相結(jié)合,示例如下:


a_obj = Counter(words)
b_obj = Counter(more_words)
print(f'the object of a is:{a_obj}')
print(f'the object of b is:{b_obj}')

c_obj = a_obj + b_obj
print(f'the object of c is:{c_obj}')

d_obj = a_obj - b_obj
print(f'the object of d is:{d_obj}')

Counter對象在需要制表或者計數(shù)的場合是非常有用的。建議在解決這類問題的時候應該優(yōu)先選擇它,而不是手動地利用字典去實現(xiàn)。

主站蜘蛛池模板: 姜堰市| 泰和县| 东城区| 贵阳市| 恭城| 石城县| 莱芜市| 金塔县| 平阴县| 枝江市| 古田县| 百色市| 绥芬河市| 洱源县| 察雅县| 台山市| 渑池县| 富锦市| 大关县| 舒兰市| 门源| 前郭尔| 巴青县| 乌兰察布市| 遂平县| 新巴尔虎左旗| 温泉县| 庐江县| 田阳县| 澜沧| 无棣县| 石家庄市| 九龙县| 普洱| 太湖县| 镇远县| 南川市| 偏关县| 龙江县| 明光市| 阿拉善左旗|