2015-02-22 3 views
-2

Так что это функция, которую я имею до сих пор. Он должен читать текстовый файл и возвращать общее количество слов. Мне разрешено использовать только for петли, while петли и string.strip(). По какой-то странной причине он подсчитывает некоторый дополнительный символ из текстового файла, включая новые строки. Вот один из текстовых файлов:Как подсчитать слова в строке, используя только циклы и string.strip()?

Words make up other words. This is a line. Sequences of words make sentences. I like words but I don't like MS Word. There's another word for how I feel about MSWord: @#%&

В этом текстовом файле имеет в общей сложности 33 слов, но моя программа подсчета 34. Каждое предложение на своей собственной линии. Третья строка имеет два ведущих пространства; пятая строка имеет 4 области вкладок.

def countWords(textFileName): 
    words = 0 
    for char in textFileName: 
     if char == " " or char == ".": 
      words = words + 1 
     if char != " " and char != ".": 
      pass 
    return words 


def main(): 
    textFileName = input("Enter textFileName: ") 
    total = 0 
    for line in open(textFileName): 
     total = total + countWords(line) 
    print(total, "words") 
main() 
+0

Что вы подразумеваете под «м сложнее, чем line.strip() "? Фактически вы не можете использовать 'str.split'? –

+0

@ das-g Я могу использовать _for loops_, _while_ loops и str.strip(). Никаких других функций Python. – Sergio

+0

В пятой строке вашего файла примера был символ табуляции впереди, а не восемь пробелов. Я изменил его в соответствии с вашим описанием, но это также может изменить результат, который ваш текущий код даст для него. –

ответ

0

Поскольку ваши слова разделены пробелами, split() будет работать на вас. Проверить это:

#!/usr/bin/python 
# -*- coding: utf-8 -*- 

def main(): 
    textFileName = 'C:\\temp\\001.txt' 
    total = 0 
    for line in open(textFileName): 

     total += len(line.split()) 
    print(total, "words") 
main() 

ВЫХОД:

(33, 'words') 

РЕДАКТИРОВАТЬ:

#!/usr/bin/python 
# -*- coding: utf-8 -*- 

def main(): 
    textFileName = 'C:\\temp\\001.txt' 
    total = 0 
    for line in open(textFileName): 
     line = str.strip(line) 
     for char in line: 
      if char == ' ': 
       total += 1 
     total += 1 
    print(total, "words") 
main() 

ВЫХОД: (33, 'слова')

str.strip() удалит вкладку, а также.

In[2]: a='\tabc' 
In[3]: print a 
    abc 
In[4]: str.strip(a) 
Out[4]: 'abc' 
+0

Разве OP не говорил, что 'split()' не разрешено? – mhawke

+0

@ m1708997017 Хотя это работает, достаточно расстраивая, нам не разрешено использовать в основном большинство функций Python, таких как len() или split() – Sergio

+0

@SergioMolina Итак, вы можете использовать str.strip(). Можете ли вы использовать str.split()? Я говорю о функции split() в модуле str. –

0

Это тривиально, если вы могли бы использовать split():

def count_words(s): 
    return len(s.split()) 

Так осуществить свою собственную версию split(), что-то вроде этого:

import string 

def splitter(s, sep=string.whitespace): 
    words = [] 
    word = [] 
    for c in s: 
     if c not in sep: 
      word.append(c) 
     else: 
      if word: 
       words.append(''.join(word)) 
       word = [] 
    if word: # handle case of no sep at end of string 
     words.append(''.join(word)) 
    return words 

Теперь вы можете переписать count_words():

def count_words(s): 
    return len(splitter(s)) 

Запуск это на входе образца:

>>> s = '''Words make up other words. 
This is a line. 
    Sequences of words make sentences. 
I like words but I don't like MS Word. 
    There's another word for how I feel about MSWord: @#%&''' 

>>> splitter(s) 
['Words', 'make', 'up', 'other', 'words.', 'This', 'is', 'a', 'line.', 'Sequences', 'of', 'words', 'make', 'sentences.', 'I', 'like', 'words', 'but', 'I', "don't", 'like', 'MS', 'Word.', "There's", 'another', 'word', 'for', 'how', 'I', 'feel', 'about', 'MSWord:', '@#%&'] 
>>> count_words(s) 
33 

Редактировать: Не разрешается использовать append() или join():

def splitter(s, sep=string.whitespace): 
    words = [] 
    word = '' 
    for c in s: 
     if c not in sep: 
      word += c 
     else: 
      if word: 
       words += [word] 
       word = '' 
    if word: # handle case of no sep at end of string 
     words += [word] 
    return words 

def count_words(s): 
    count = 0 
    for word in splitter(s): 
     count += 1 
    return count 

>>> splitter(s) 
['Words', 'make', 'up', 'other', 'words.', 'This', 'is', 'a', 'line.', 'Sequences', 'of', 'words', 'make', 'sentences.', 'I', 'like', 'words', 'but', 'I', "don't", 'like', 'MS', 'Word.', "There's", 'another', 'word', 'for', 'how', 'I', 'feel', 'about', 'MSWord:', '@#%&'] 
>>> count_words(s) 
33 

и более прямой подход:

def count_words(s, sep=string.whitespace): 
    count = 0 
    in_word = False 
    for c in s: 
     if c not in sep: 
      if not in_word: 
       count += 1 
       in_word = True 
     else: 
      in_word = False 
    return count 
+0

Я не могу использовать функцию append, в основном только _for_ и _while_ loops и str.strip(). – Sergio

+0

@SergioMolina: можете ли вы использовать '+' список стилей и конкатенацию строк? Как насчет 'join()'? – mhawke

+0

Вы не можете использовать join(), и вы можете использовать конкатенацию строк – Sergio

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