2016-09-14 4 views
0

Я пытаюсь вывести общее количество слов, начинающихся с буквы 'a' в виде списка из отдельного текстового файла. Я ищу такой результат.Найти, сколько слов начинается с определенной буквы в списке

35 words start with a letter 'a'. 

Однако, я уверен, выводя все слова, которые начинаются с 'a' вместо общего с моим текущим кодом. Должен ли я использовать что-то другое, кроме цикла for?

До сих пор, это то, что я пытался:

wordsFile = open("words.txt", 'r') 
words = wordsFile.read() 
wordsFile.close() 
wordList = words.split() 

print("Words:",len(wordList)) # prints number of words in the file. 

a_words = 0 

for a_words in wordList: 
    if a_words[0]=='a': 
     print(a_words, "start with the letter 'a'.") 

Выход я получаю до сих пор:

Words: 334 
abate start with the letter 'a'. 
aberrant start with the letter 'a'. 
abeyance start with the letter 'a'. 

и так далее.

+0

_However, я буду выводить все слова, которые начинаются с «a'_ Это потому, что в вашем файле' for' loop, вы имеете инструкцию 'print'. Если вы не хотите печатать слова, тогда ...нет. –

ответ

2

Вы используете a_words в качестве значения слова на каждой итерации и пропускаете счетчик. Если мы изменим цикл for на words как значение и зарезервировали a_words для счетчика, мы можем увеличивать счетчик каждый раз, когда критерии передаются. Вы можете изменить a_words на wordCount или что-то общее, чтобы сделать его более портативным и дружественным для других букв.

a_words = 0 

for words in wordList: 
    if words[0]=='a': 
     a_words += 1 

print(a_words, "start with the letter 'a'.") 
+0

Это делается именно так: суммирование вхождений слов, начинающихся с буквы 'a'. Что вы еще хотите? Нет ничего более эффективного, чем это простое линейное решение. Фактически, любой другой метод вводит дополнительные накладные расходы (конечно, недостаточно значимые, чтобы повлиять на производительность, но все же не нужно). Более того, я предпочитаю это по одному линейному решению Jim на том основании, что, похоже, вам нужно лучше понять базовую петлю и общее решение проблемы разработки программного обеспечения. – JSF

+0

Это выводит итог на одну строку. Если вы берете инструкцию 'print' из цикла for, тогда она будет печатать только итоговые данные после завершения цикла. – ode2k

3

Вы могли бы заменить это sum вызов, в котором вы кормите 1 для каждого слова в wordList, который начинается с a:

print(sum(1 for w in wordList if w.startswith('a')), 'start with the letter "a"') 

Это может быть дополнительно урезана, если использовать логические значения, возвращаемые startswith вместо , так как True трактуется как 1 в этих условиях эффект тот же:

print(sum(w.startswith('a') for w in a), 'start with the letter "a"') 

С вашей Curre nt, вы ничего не суммируете, вы просто печатаете любое слово, которое соответствует. Кроме того, вы переименовываете a_word из int в содержимое списка, когда вы его итерации.

Кроме того, вместо использования a_word[0] для проверки первого символа вы можете использовать startswith(character), который имеет тот же эффект и является более читаемым.

+0

Столь же важно, что это скрывает фундаментальные детали, которые, по-видимому, OP действительно нуждаются в лучшем понимании. – JSF

+0

@ JSF Действительно, но это касается не только ОП, но и любого, кто может столкнуться с этим. Я дал общее решение и небольшое объяснение его ошибки; если OP нуждается в фундаментальных принципах, он должен перейти на 'docs.python.org', а не StackOverflow: P –

+0

Но, увы, вот он. Он и такие, как он; они никуда не денутся. – JSF

1

sum(generator) это путь, но для полноты изложения, вы можете сделать это с список понимания (может быть, если это немного более удобным для чтения, или вы хотите сделать что-то со словами, начиная с и т.д.).

words_starting_with_a = [word for word in word_list if word.startswith('a')] 

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

print(len(words_starting_with_a), "words start with a letter 'a'") 
0

Простое альтернативное решение с использованием re.findall функции (без текста расщепления и for цикла):

import re 
... 
words = wordsFile.read() 
... 
total = len(re.findall(r'\ba\w+?\b', words)) 
print('Total number of words that start with a letter "a" : ', total) 
Смежные вопросы