def openFile(fileName): infile = open(fileName, "r") infile.readline() words = [] for data in infile: dataStrip = data.strip('n') words.append(dataStrip) return words def findVowels(words): splitWord = words.split() for word in splitWord: if word == "a" or "e" or "i" or "o" or "u": return True else: return False def main(): file = openFile("vowels.txt") for word in file: vowelCount = 0 if findVowels(word): vowelCount += 1 else: vowelCount = vowelCount print(f"{word} has {vowelCount} vowels in it") main()
So, this is what I have so far to find vowels in each word in the text file. It doesn’t work, and I still need to be able to count how many consecutive vowels are in the words. If you can help, but make it to the level of simplicity I have done so far, that’d be great help. Lmk if you need more info.
Advertisement
Answer
My version which search highest consecutive amount.
I use list for this
- if there is vowel then add +1 to last value on list (with curren consecutive vowels),
- if there is no vowel then append 0 at the end of list (to count next consecutive vowels)
And later I get max()
def count_vowels(word): all_results = [0] current = 0 sequence = 1 for char in word: if char in 'aeiou': all_results[-1] += 1 # update last item else: all_results.append(0) # add new last item print(char, all_results) return max(all_results) def main(): words = "aaabeehi9ooguuute queueing aeioua aaaTee BTW aaa aTa".split() for word in words: vowel_count = count_vowels(word) print(f"{word} has {vowel_count} vowels in it") main()
Result: (which display also history of counting)
a [1] a [2] a [3] b [3, 0] e [3, 1] e [3, 2] h [3, 2, 0] i [3, 2, 1] 9 [3, 2, 1, 0] o [3, 2, 1, 1] o [3, 2, 1, 2] g [3, 2, 1, 2, 0] u [3, 2, 1, 2, 1] u [3, 2, 1, 2, 2] u [3, 2, 1, 2, 3] t [3, 2, 1, 2, 3, 0] e [3, 2, 1, 2, 3, 1] aaabeehi9ooguuute has 3 vowels in it q [0, 0] u [0, 1] e [0, 2] u [0, 3] e [0, 4] i [0, 5] n [0, 5, 0] g [0, 5, 0, 0] queueing has 5 vowels in it a [1] e [2] i [3] o [4] u [5] a [6] aeioua has 6 vowels in it a [1] a [2] a [3] T [3, 0] e [3, 1] e [3, 2] aaaTee has 3 vowels in it B [0, 0] T [0, 0, 0] W [0, 0, 0, 0] BTW has 0 vowels in it a [1] a [2] a [3] aaa has 3 vowels in it a [1] T [1, 0] a [1, 1] aTa has 1 vowels in it
EDIT:
Version which can count highest consecutive vowels
and highest consecutive non-vowels
. For non-volwes
I use negative value and min()
. Because sometime text may have only vowels
or only non-vowels
so I add extra 0
in all_results
def count_vowels(word): all_results = [0, 0] current = 0 sequence = 1 for char in word: if char in 'aeiou': if all_results[-1] < 0: all_results.append(0) all_results[-1] += 1 # update last item else: if all_results[-1] > 0: all_results.append(0) # add new last item all_results[-1] -= 1 # update last item print(char, all_results) return max(all_results), min(all_results) def main(): words = "aaabeehi9ooguuute queueing aeioua aaaTee BTW aaa aTa".split() for word in words: vowel_count = count_vowels(word) print(f"{word} | max vowels: {vowel_count[0]} | max non-vowels: {-vowel_count[1]}") main()
Result:
a [0, 1] a [0, 2] a [0, 3] b [0, 3, -1] e [0, 3, -1, 1] e [0, 3, -1, 2] h [0, 3, -1, 2, -1] i [0, 3, -1, 2, -1, 1] 9 [0, 3, -1, 2, -1, 1, -1] o [0, 3, -1, 2, -1, 1, -1, 1] o [0, 3, -1, 2, -1, 1, -1, 2] g [0, 3, -1, 2, -1, 1, -1, 2, -1] u [0, 3, -1, 2, -1, 1, -1, 2, -1, 1] u [0, 3, -1, 2, -1, 1, -1, 2, -1, 2] u [0, 3, -1, 2, -1, 1, -1, 2, -1, 3] t [0, 3, -1, 2, -1, 1, -1, 2, -1, 3, -1] e [0, 3, -1, 2, -1, 1, -1, 2, -1, 3, -1, 1] aaabeehi9ooguuute | max vowels: 3 | max non-vowels: 1 q [0, -1] u [0, -1, 1] e [0, -1, 2] u [0, -1, 3] e [0, -1, 4] i [0, -1, 5] n [0, -1, 5, -1] g [0, -1, 5, -2] queueing | max vowels: 5 | max non-vowels: 2 a [0, 1] e [0, 2] i [0, 3] o [0, 4] u [0, 5] a [0, 6] aeioua | max vowels: 6 | max non-vowels: 0 a [0, 1] a [0, 2] a [0, 3] T [0, 3, -1] e [0, 3, -1, 1] e [0, 3, -1, 2] aaaTee | max vowels: 3 | max non-vowels: 1 B [0, -1] T [0, -2] W [0, -3] BTW | max vowels: 0 | max non-vowels: 3 a [0, 1] a [0, 2] a [0, 3] aaa | max vowels: 3 | max non-vowels: 0 a [0, 1] T [0, 1, -1] a [0, 1, -1, 1] aTa | max vowels: 1 | max non-vowels: 1
BTW:
To count more types of chars – vowels
, consonants
, digits
, others
– I would use tuples ("vowels", 0)
, ("consonants", 0)
instead of positive
and negative
values.
EDIT:
Full code
I assume you have every word in separated line and you don’t have header at the top of file.
def count_vowels(word): all_results = [0] current = 0 sequence = 1 for char in word: if char in 'aeiou': all_results[-1] += 1 # update last item else: all_results.append(0) # add new last item #print(char, all_results) # ie. `g [0, 5, 0, 0]` return max(all_results) def read_words(): fh = open("vowels.txt") # `fh` means `file handler` text = fh.read() # read all as one string fh.close() words = text.split("n") # split string into list of lines #words = text.splitlines() # split string into list of lines #words = words[1:] # skip first line with header #words = "aaabeehi9ooguuute queueing aeioua aaaTee BTW aaa aTa".split() return words def main(): # --- read --- words = read_words() # --- count --- words_with_counts = [] for word in words: vowel_count = count_vowels(word) words_with_counts.append( (vowel_count, word) ) # --- sort --- sorted_words_with_counts = sorted(words_with_counts) #, reverse=True) # --- display --- for vowel_count, word in sorted_words_with_counts: print(f"{word} has {vowel_count} vowels in it") # --- main --- main()