Average word length - punctuation (",", ".", ";") and newline characters {"\n"}

Viewed 59

I want to write a Python script that will read a test from the console and output the average number of characters per word,but i have some problem with punctuation and newline characters . there is my code.

def main():
    allwords = []
    while True:
         words = input()
         if words == "Amen.":
           break
         allwords.extend(words.split())
    txt = " ".join( allwords)
    n_pismen = len([c for c in txt if c.isalpha()])
    n_slov = len([i for i in range(len(txt) - 1) if txt[i].isalpha() and not txt[i + 1].isalpha()])
    for char in (',', '.', ';'):
        txt = txt.replace(char, '')
    txt.replace('\n', ' ')
    words = txt.split()
    print(sum(len(word) for word in words) / len(words))
    if words:
        average = sum(len(words) for words in  allwords) / len( allwords) 

if __name__ == '__main__':
    main() 

Our Father, which art in heaven,
hallowed be thy name;
thy kingdom come;
thy will be done,
in earth as it is in heaven.
Give us this day our daily bread.
And forgive us our trespasses,
as we forgive them that trespass against us.
And lead us not into temptation,
but deliver us from evil.
For thine is the kingdom,
the power, and the glory,
For ever and ever.
Amen.

normal will be output 4.00,but i just get 1.00

4 Answers

Not sure what's wrong in your example, but this will work. I used "test" as the string name, you can modify that as desired:

counts = [] #List to store number of characters per word
for t in test.split(): #Split to substrings at whitespace
    counts.append(len([c for c in t if c.isalpha()])) #Calculate the length of each word ignoring non-letters
print(sum(counts)/len(counts)) #Compute the average

I would match every word using a regex, than keep track on # of words and # of total characters:

import re

total_number = 0
n_words = 0

pattern = re.compile("[a-z]+", re.IGNORECASE)

with open({PATH_TO_YOUR_FILE}, "r") as f:
    for line in f:
        words = pattern.findall(line)
        n_words += len(words)
        total_number += sum([len(x) for x in words])

print(total_number/n_words)

OUTPUT

4.0    

You can do this as follows (where strng is the passage of text):

# Remove all of the 'bad' characters
for char in (',', '.', ';'):
    strng = strng.replace(char, '')
strng.replace('\n', ' ')
# Split on spaces
words = strng.split()
# Calculate the average length
print(sum(len(word) for word in words) / len(words))

Try this:

import string

s = input()
s = s.translate(str.maketrans('', '', string.punctuation)
s.replace('\n', ' ')
words = s.split()
print(sum(map(len, words)) / len(words))
Related