2014-07-08 86 views
4

我已經解決checkio.com的問題和提出的問題之一是:「寫一個函數來找到發生一個給定的字符串中的最大次數字母」python中內置的.count是什麼?

頂部的解決方案是:

import string 

def checkio(text): 
    """ 
    We iterate through latin alphabet and count each letter in the text. 
    Then 'max' selects the most frequent letter. 
    For the case when we have several equal letter, 
    'max' selects the first from they. 
    """ 
    text = text.lower() 
    return max(string.ascii_lowercase, key=text.count) 

我不明白text.count是什麼時候它被用作max函數中的鍵。

編輯:對不起,沒有更具體。我知道程序的功能以及str.count()的功能。我想知道什麼是text.count。如果.count是一種方法,那麼不應該使用大括號。

+0

嗯.Count之間存在:http://stackoverflow.com/questions/1155617/count-occurrence-of-a-character-in-a-string – RvdK

+0

參見[文檔】(HTTPS://文檔.python.org/2 /庫/ string.html#string.count)。問題是什麼?什麼'計數'呢,或什麼'鍵'呢? –

+1

Ouch。這樣看上去效率低:P –

回答

0

使用集合模塊中的計數器函數。

>>> import collections 
>>> word = "supercalafragalistic" 
>>> c = collections.Counter(word) 
>>> c.most_common() 
[('a', 4), ('c', 2), ('i', 2), ('l', 2), ('s', 2), ('r', 2), ('e', 1), ('g', 1), ('f', 1), ('p', 1), ('u', 1), ('t', 1)] 
>>> c.most_common()[0] 
('a', 4) 
+2

這似乎並沒有回答這個問題,「這是什麼,當它被用作max函數的關鍵text.count怎麼辦?」 – Kevin

+0

它不回答這個問題「什麼是在Python內置的.Count中?」 – jumbopap

+3

如何?你不提'在你的答案的任何地方str.count'。 – Kevin

2

max()一個關鍵函數被調用用於每個元件提供一種替代,以確定由最大,在這種情況下是不是所有的高效。

從本質上講,線可以翻譯成:

max_character, max_count = None, -1 
for character in string.ascii_lowercase: 
    if text.count(character) > max_count: 
     max_character = character 
return max_character 

其中str.count()遍歷整個的text計數多久character發生。

你應該真的在這裏使用multiset/bag;在Python該年代由collections.Counter() type提供:

max_character = Counter(text.lower()).most_common(1)[0][0] 

Counter()花費O(N)的時間來計數在長度爲N的字符串中的字符,然後以找到最大,另一個O(K)來確定最高計數,其中K是唯一字符的數量。漸近地說,這使整個過程花費O(N)時間。

max()方法需要O(MN)時間,其中M爲string.ascii_lowercase長度。

4

key=text.count是統計所有字母出現在字符串中的次數,然後您用所有這些數字中最高的數字來得到出現的最頻繁的字母。

當下面的代碼運行,其結果是e,這一點,如果算上,最常見的字母。

import string 

def checkio(text): 
    """ 
    We iterate through latin alphabet and count each letter in the text. 
    Then 'max' selects the most frequent letter. 
    For the case when we have several equal letter, 
    'max' selects the first from they. 
    """ 
    text = text.lower() 
    return max(string.ascii_lowercase, key=text.count) 

print checkio('hello my name is heinst') 
相關問題