起因是看到一道面試題
“統計字符串中出現次數最多的字符,並返回出現次數”
問題很簡單,剛開始沒思路,只想到了循環統計,但是覺得太蠢了,直到我發現了max()的key用法,果然還是我之前學的太淺了~
s="zxcvbnmasdaasdafa"
max_s = max(s,key=s.count) # 返回出現次數最多的字符
s.count(max_s) # 返回次數
相關知識點:
max(iterable, *[, key, default])
官方文檔是這么寫,寫的還是很詳細:
返回可迭代對象中最大的元素,或者返回兩個及以上實參中最大的。
如果只提供了一個位置參數,它必須是非空 iterable,返回可迭代對象中最大的元素;如果提供了兩個及以上的位置參數,則返回最大的位置參數。
有兩個可選只能用關鍵字的實參。key 實參指定排序函數用的參數,如傳給 list.sort() 的。default 實參是當可迭代對象為空時返回的值。如果可迭代對象為空,並且沒有給 default ,則會觸發 ValueError。
如果有多個最大元素,則此函數將返回第一個找到的。這和其他穩定排序工具如 sorted(iterable, key=keyfunc, reverse=True)[0] 和 heapq.nlargest(1, iterable, key=keyfunc) 保持一致。
3.4 新版功能: keyword-only 實參 default 。
在 3.8 版更改: key 可以為 None。
max(s,key=s.count)
key接受一個函數對象,引用s.count函數,s中的每一個字符均會傳入s.count(sub, start= 0,end=len(string))函數,並對所有字符的計算結果進行max()計算。
P.S.這種解法有個不太好的地方,如果有兩個字符出現的次數一樣,僅能返回第一個找到的字符
如s = "asdf zxcva12q awww"
只會返回"a",但是其實"w"和"a"出現的次數一樣,都是3
還有另一種解法
利用colletions模塊
from collections import Counter
c = Counter(s)
c.most_common()
# 輸出為 [('a', 3), ('w', 3), (' ', 2), ('s', 1), ('d', 1), ('f', 1), ('z', 1), ('x', 1), ('c', 1), ('v', 1), ('1', 1), ('2', 1),('q', 1)]
結果是按出現次數順序排列的列表
具體就不說了,colletions太強大了,說起來還是很多點的,有機會再細看