2014-11-01 45 views
0

我試圖使用以下定義和輔助函數clean_up來計算列表中每個單詞的平均字符數。列表中每個單詞的平均字符數

定義:

  • 令牌是從上線的 調用split()文件
  • 搭話的字符串是不是完全由標點符號
  • 的非空令牌
  • 句子是由字符!?.或EOF終止的字符序列,但不包括字符。句子排除兩端的空白,並且不是空字符串。
def clean_up(s): 
    """ (str) -> str 

    Return a new string based on s in which all letters have been 
    converted to lowercase and punctuation characters have been stripped 
    from both ends. Inner punctuation is left untouched. 

    >>> clean_up('Happy Birthday!!!') 
    'happy birthday' 
    >>> clean_up("-> It's on your left-hand side.") 
    " it's on your left-hand side" 
    """ 

    punctuation = """!"',;:.-?)([]<>*#\n\t\r""" 
    result = s.lower().strip(punctuation) 
    return result 

我的代碼是:

def avg_word_length(text): 
    """ (list of str) -> float 

    Precondition: text is non-empty. Each str in text ends with \n and 
    text contains at least one word. 

    Return the average length of all words in text. 

    >>> text = ['James Fennimore Cooper\n', 'Peter, Paul and Mary\n'] 
    >>> avg_word_length(text): 
    5.142857142857143 
    """ 

    a = '' 
    for i in range(len(text)): 
     a = a + clean_up(text[i]) 
     words = a.split() 
    for word in words: 
     average = sum(len(word) for word in words)/len(words) 
    return average 

我得到的6.16666值...因爲我的答案。
我正在使用Python 3

+0

爲什麼這個結果會讓你困惑?你知道正確的答案是別的嗎? – 2014-11-01 20:49:29

+0

預期的輸出(5.14 ..)顯然在文檔字符串中給出,這就是OP令人困惑的原因。 – DSM 2014-11-01 20:57:02

+0

你在你的問題中定義了一個使得'1111111111111111111111111111111111111111111111111.1.'合法的句子。你從哪裏得到這個定義?事實是,你無法確定句子在哪裏/是什麼。它的語言是一種非常主觀的東西,被解釋和_vague_。 – sln 2014-11-01 21:17:15

回答

3

在代碼中有兩個相當多的邏輯錯誤。

首先,在clean_up中,您將從字符串的開始和結尾刪除分隔符,但在字符串中不是連續的。你也不會分裂你正在剝離的相同分隔符;結果是,"Peter,"使它作爲一個單詞超過它應該通過。

其次,剝離後,您將連接線與a = a + clean_up(text[i])。這意味着你確保,你有太長和很少的單詞,因爲一行的最後一個單詞與下一個單詞的第一個單詞相結合;在這種情況下,您可以將"CooperPeter,"作爲一個單詞。

如果您只在第二個循環之前打印words(它沒有理由是循環,考慮sum()調用中的生成器表達式),這兩個問題都相當明顯。

就我個人而言,我可能會使用re模塊來查找具有單一一致定義(例如r"\w+")的單詞並對其長度進行計數,而不是收集帶有其內容的字符串。

+0

OP在清理中的文檔字符串表示內部標點符號是獨立的,所以他們必須要在Peter的末尾... – Ben 2014-11-01 23:51:50

+0

但我們還沒有談到關於re模塊。它是什麼?@Yann Vernier – Ivyy 2014-11-02 00:08:02

+0

嗯。我確實閱讀過,並且認爲單詞只是字母。它與avg_word_length docstring中給出的數字相匹配。文檔字符串值與定義不匹配。 re模塊用於正則表達式,這是用於匹配文本模式的語言。 – 2014-11-02 14:32:33