Средняя длина слов в файле и удаление пунктуации Python 3 - PullRequest
0 голосов
/ 24 ноября 2018

Я пытаюсь удалить знаки препинания для вычисления среднего числа слов из текстового файла.Может кто-нибудь сказать мне, где я иду не так, пожалуйста?

name = "/Users/Desktop/name.txt"
punct = "!()-[]{};:'\,<>./?@#$%^&*_~"
no_punct = ""
textfile = open(name, "r")
letter_count1 = 0
letter_count2 = 0
for line in textfile:
    for word in line.split():
        for c in word:
            if c not in punct:
                no_punct = no_punct + c
                letter_count1 += 1
                letter_count2 += len(word)   

avg = float(letter_count2)/float(letter_count1)
print("Average words: ", avg)

textfile.close()

Ответы [ 3 ]

0 голосов
/ 24 ноября 2018

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

import re

num_words = 0
num_chars = 0

with open("/Users/Desktop/name.txt", "r") as file:
    for line in file:
        clean = re.sub(r'[^\w\s]', '', line)
        words = clean.split()

        # Operate on list of words...
        num_words += len(words)
        for w in words:
            num_chars += len(w)

    avg = num_chars / num_words
    print("Average word length: {}".format(avg))
0 голосов
/ 24 ноября 2018

Я думаю, что в вашем коде «letter_count1» должно быть количество слов, а «letter_count2» - количество символов без количества знаков препинания.Проверьте это:

punct = "!()-+[]{};:'\,<>./?@#$%^&*_~"
nwords=letters=0
with open(file_name) as ff:
    for line in ff:
        for w in line.split():
            lth=len(w)-len([1 for c in w if c in punct]) 
            if lth: 
                nwords+=1 
                letters+=lth 

print(letters/nwords)
0 голосов
/ 24 ноября 2018

Проблема вашего кода заключалась в том, что вы перебирали каждый символ каждого слова for c in word:, чтобы проверить, содержит ли оно нежелательные символы из punct, поэтому, если, например, вы проверяли слово somewo?rd, letter_count1 увеличивалось для каждого символа в этом слове, кроме ?.Вы можете исправить это, проверив, находится ли какой-либо символ punct в нашем текущем слове без цикла, используя понимание списка.

name = "/Users/Desktop/name.txt"
name = 'name.txt'
punct = "!()-[]{};:'\,<>./?@#$%^&*_~"

textfile = open(name, "r")

letter_count1 = 0
letter_count2 = 0
for line in textfile:
    for word in line.split():
        if all(i not in word for i in punct):
            letter_count1 += 1
            letter_count2 += len(word)   

avg = float(letter_count2)/float(letter_count1)
print("Average word length: ", avg)

textfile.close()

С входным файлом:

test test1
te[]st correct not_wrong
<so_wrong> ~lastone;

Я получил вывод:

Average word length:  5.333333333333333
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...