2016-09-14 7 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ループの場合、 'print'文があります。あなたが言葉を印刷したくない場合は、...しないでください。 –

答えて

2

各反復で単語の値としてa_wordsを使用し、カウンタがありません。 forループの値をwordsに変更し、カウンタにa_wordsを予約した場合、条件が満たされるたびにカウンタを増やすことができます。 a_wordswordCountに変更したり、他の文字のために移植性と親しみやすいものにすることができます。

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

これは、合計を1行に出力します。 'print'文をforループから取り出した場合、ループの実行が完了した後にのみ合計が出力されます。 – ode2k

3

あなたはaで始まるwordList内のすべての単語を1を供給するsumコールでこれを置き換えることができます:あなたの代わりにstartswithによって返されたブール値を使用する場合、これはさらに下にトリミングすることができ

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

Trueは、これらのコンテキストに1として扱われているので、効果は同じである:あなたの電流増幅率で

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

あなたが何かを合計していない、あなたは単に一致する単語を印刷しています。さらに、a_wordの名前をintからそれを反復するときにリストの内容に変更します。

また、a_word[0]を使用して最初の文字を確認する代わりに、startswith(character)を使用すると、同じ効果があり、少しだけ読みやすくなります。

+0

これは素晴らしいことですが、それはOPの本当のところより良い理解が必要なように見える基本的な詳細を隠しています。 – JSF

+0

@JSF確かに、これはOPだけではなく、これにぶつかりそうな人のことです。私は一般的な解決策と彼の間違いの小さな説明を与えた。 OPが基本を必要とする場合、彼はStackOverflowではなくdocs.python.orgに行くべきです: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) 
関連する問題