2014-02-25 2 views
4

Я новичок в Python, и мне нужно, чтобы вычислить среднее количество символов в слове в спискесреднее количество символов в слове в списке

, используя эти определения и вспомогательные функции clean_up.

token - это str, которую вы получаете от вызова метода string, разбитого на строку файла.

Слово является непустым токеном из файла, который не полностью состоит из знаков препинания. найти «слова» в файле с помощью str.split, чтобы найти маркеры, а затем удалить знаки препинания из слов с помощью вспомогательной функции clean_up.

Приговор представляет собой последовательность символов, заканчивающихся (но не включает) символы !, ?, . или конец файла, исключает пропуски на обоих концах, и не пусто.

Это мое домашнее задание вопрос из моего компьютерного класса науки в моем колледже

функция очистки является:

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

мой код:

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

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

    Return the average length of all words in text. Surrounding punctuation 
    is not counted as part of the words. 


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

    for ch in text: 
     word = ch.split() 
     clean = clean_up(ch) 
     average = len(clean)/len(word) 
    return average 

я получаю 5.0, но я действительно смущен, некоторая помощь будет принята с благодарностью :) PS Я использую python 3

+1

Вы хотите 'float (len (word))' – Hoopdady

+0

@Hoopdady OP использует Python3. –

+3

Это дает только среднее значение последнего элемента на входе – M4rtini

ответ

6

Давайте очистим некоторые из этих функций с помощью импорта и выражений генератора, не так ли?

import string 

def clean_up(s): 
    # I'm assuming you REQUIRE this function as per your assignment 
    # otherwise, just substitute str.strip(string.punctuation) anywhere 
    # you'd otherwise call clean_up(str) 
    return s.strip(string.punctuation) 

def average_word_length(text): 
    total_length = sum(len(clean_up(word)) for sentence in text for word in sentence.split()) 
    num_words = sum(len(sentence.split()) for sentence in text) 
    return total_length/num_words 

Вы можете заметить это на самом деле конденсируется в длину и нечитаемым однострочника:

average = sum(len(word.strip(string.punctuation)) for sentence in text for word in sentence.split())/sum(len(sentence.split()) for sentence in text) 

Это грубое и отвратительное, поэтому вы не должны делать это;). Показатели удобочитаемости и все такое.

+0

большое вам спасибо! :) –

5

Это короткий и сладкий метод решения вашей проблемы, который по-прежнему доступен для чтения.

def clean_up(word, punctuation="!\"',;:.-?)([]<>*#\n\\"): 
    return word.lower().strip(punctuation) # you don't really need ".lower()" 

def average_word_length(text): 
    cleaned_words = [clean_up(w) for w in (w for l in text for w in l.split())] 
    return sum(map(len, cleaned_words))/len(cleaned_words) # Python2 use float 

>>> average_word_length(['James Fennimore Cooper\n', 'Peter, Paul and Mary\n']) 
5.142857142857143 

Бремя всех этих предусловий относится к вам.

+0

@AshwiniChaudhary Или список-понимание. :) –

Смежные вопросы