Add missing type annotations for `strings` directory (#5817) · datevid/PythonTheAlgorithms@e95ecfa · GitHub
Skip to content

Commit e95ecfa

Browse files
Add missing type annotations for strings directory (TheAlgorithms#5817)
* Type annotations for `strings/autocomplete_using_trie.py` * Update autocomplete_using_trie.py * Update detecting_english_programmatically.py * Update detecting_english_programmatically.py * Update frequency_finder.py * Update frequency_finder.py * Update frequency_finder.py * Update word_occurrence.py * Update frequency_finder.py * Update z_function.py * Update z_function.py * Update frequency_finder.py
1 parent bbb88bb commit e95ecfa

5 files changed

Lines changed: 82 additions & 102 deletions

File tree

strings/autocomplete_using_trie.py

Lines changed: 16 additions & 12 deletions

strings/detecting_english_programmatically.py

Lines changed: 27 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -4,55 +4,56 @@
44
LETTERS_AND_SPACE = UPPERLETTERS + UPPERLETTERS.lower() + " \t\n"
55

66

7-
def loadDictionary():
7+
def load_dictionary() -> dict[str, None]:
88
path = os.path.split(os.path.realpath(__file__))
9-
englishWords = {}
10-
with open(path[0] + "/dictionary.txt") as dictionaryFile:
11-
for word in dictionaryFile.read().split("\n"):
12-
englishWords[word] = None
13-
return englishWords
9+
english_words: dict[str, None] = {}
10+
with open(path[0] + "/dictionary.txt") as dictionary_file:
11+
for word in dictionary_file.read().split("\n"):
12+
english_words[word] = None
13+
return english_words
1414

1515

16-
ENGLISH_WORDS = loadDictionary()
16+
ENGLISH_WORDS = load_dictionary()
1717

1818

19-
def getEnglishCount(message):
19+
def get_english_count(message: str) -> float:
2020
message = message.upper()
21-
message = removeNonLetters(message)
22-
possibleWords = message.split()
21+
message = remove_non_letters(message)
22+
possible_words = message.split()
2323

24-
if possibleWords == []:
24+
if possible_words == []:
2525
return 0.0
2626

2727
matches = 0
28-
for word in possibleWords:
28+
for word in possible_words:
2929
if word in ENGLISH_WORDS:
3030
matches += 1
3131

32-
return float(matches) / len(possibleWords)
32+
return float(matches) / len(possible_words)
3333

3434

35-
def removeNonLetters(message):
36-
lettersOnly = []
35+
def remove_non_letters(message: str) -> str:
36+
letters_only = []
3737
for symbol in message:
3838
if symbol in LETTERS_AND_SPACE:
39-
lettersOnly.append(symbol)
40-
return "".join(lettersOnly)
39+
letters_only.append(symbol)
40+
return "".join(letters_only)
4141

4242

43-
def isEnglish(message, wordPercentage=20, letterPercentage=85):
43+
def is_english(
44+
message: str, word_percentage: int = 20, letter_percentage: int = 85
45+
) -> bool:
4446
"""
45-
>>> isEnglish('Hello World')
47+
>>> is_english('Hello World')
4648
True
47-
48-
>>> isEnglish('llold HorWd')
49+
>>> is_english('llold HorWd')
4950
False
5051
"""
51-
wordsMatch = getEnglishCount(message) * 100 >= wordPercentage
52-
numLetters = len(removeNonLetters(message))
53-
messageLettersPercentage = (float(numLetters) / len(message)) * 100
54-
lettersMatch = messageLettersPercentage >= letterPercentage
55-
return wordsMatch and lettersMatch
52+
words_match = get_english_count(message) * 100 >= word_percentage
53+
num_letters = len(remove_non_letters(message))
54+
message_letters_percentage = (float(num_letters) / len(message)) * 100
55+
letters_match = message_letters_percentage >= letter_percentage
56+
return words_match and letters_match
5657

5758

5859
if __name__ == "__main__":

strings/frequency_finder.py

Lines changed: 34 additions & 60 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,9 @@
11
# Frequency Finder
22

3+
import string
4+
35
# frequency taken from http://en.wikipedia.org/wiki/Letter_frequency
4-
englishLetterFreq = {
6+
english_letter_freq = {
57
"E": 12.70,
68
"T": 9.06,
79
"A": 8.17,
@@ -33,85 +35,57 @@
3335
LETTERS = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"
3436

3537

36-
def getLetterCount(message):
37-
letterCount = {
38-
"A": 0,
39-
"B": 0,
40-
"C": 0,
41-
"D": 0,
42-
"E": 0,
43-
"F": 0,
44-
"G": 0,
45-
"H": 0,
46-
"I": 0,
47-
"J": 0,
48-
"K": 0,
49-
"L": 0,
50-
"M": 0,
51-
"N": 0,
52-
"O": 0,
53-
"P": 0,
54-
"Q": 0,
55-
"R": 0,
56-
"S": 0,
57-
"T": 0,
58-
"U": 0,
59-
"V": 0,
60-
"W": 0,
61-
"X": 0,
62-
"Y": 0,
63-
"Z": 0,
64-
}
38+
def get_letter_count(message: str) -> dict[str, int]:
39+
letter_count = {letter: 0 for letter in string.ascii_uppercase}
6540
for letter in message.upper():
6641
if letter in LETTERS:
67-
letterCount[letter] += 1
42+
letter_count[letter] += 1
6843

69-
return letterCount
44+
return letter_count
7045

7146

72-
def getItemAtIndexZero(x):
47+
def get_item_at_index_zero(x: tuple) -> str:
7348
return x[0]
7449

7550

76-
def getFrequencyOrder(message):
77-
letterToFreq = getLetterCount(message)
78-
freqToLetter = {}
51+
def get_frequency_order(message: str) -> str:
52+
letter_to_freq = get_letter_count(message)
53+
freq_to_letter: dict[int, list[str]] = {
54+
freq: [] for letter, freq in letter_to_freq.items()
55+
}
7956
for letter in LETTERS:
80-
if letterToFreq[letter] not in freqToLetter:
81-
freqToLetter[letterToFreq[letter]] = [letter]
82-
else:
83-
freqToLetter[letterToFreq[letter]].append(letter)
57+
freq_to_letter[letter_to_freq[letter]].append(letter)
58+
59+
freq_to_letter_str: dict[int, str] = {}
8460

85-
for freq in freqToLetter:
86-
freqToLetter[freq].sort(key=ETAOIN.find, reverse=True)
87-
freqToLetter[freq] = "".join(freqToLetter[freq])
61+
for freq in freq_to_letter:
62+
freq_to_letter[freq].sort(key=ETAOIN.find, reverse=True)
63+
freq_to_letter_str[freq] = "".join(freq_to_letter[freq])
8864

89-
freqPairs = list(freqToLetter.items())
90-
freqPairs.sort(key=getItemAtIndexZero, reverse=True)
65+
freq_pairs = list(freq_to_letter_str.items())
66+
freq_pairs.sort(key=get_item_at_index_zero, reverse=True)
9167

92-
freqOrder = []
93-
for freqPair in freqPairs:
94-
freqOrder.append(freqPair[1])
68+
freq_order: list[str] = [freq_pair[1] for freq_pair in freq_pairs]
9569

96-
return "".join(freqOrder)
70+
return "".join(freq_order)
9771

9872

99-
def englishFreqMatchScore(message):
73+
def english_freq_match_score(message: str) -> int:
10074
"""
101-
>>> englishFreqMatchScore('Hello World')
75+
>>> english_freq_match_score('Hello World')
10276
1
10377
"""
104-
freqOrder = getFrequencyOrder(message)
105-
matchScore = 0
106-
for commonLetter in ETAOIN[:6]:
107-
if commonLetter in freqOrder[:6]:
108-
matchScore += 1
78+
freq_order = get_frequency_order(message)
79+
match_score = 0
80+
for common_letter in ETAOIN[:6]:
81+
if common_letter in freq_order[:6]:
82+
match_score += 1
10983

110-
for uncommonLetter in ETAOIN[-6:]:
111-
if uncommonLetter in freqOrder[-6:]:
112-
matchScore += 1
84+
for uncommon_letter in ETAOIN[-6:]:
85+
if uncommon_letter in freq_order[-6:]:
86+
match_score += 1
11387

114-
return matchScore
88+
return match_score
11589

11690

11791
if __name__ == "__main__":

strings/word_occurrence.py

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
# Created by sarathkaul on 17/11/19
22
# Modified by Arkadip Bhattacharya(@darkmatter18) on 20/04/2020
33
from collections import defaultdict
4+
from typing import DefaultDict
45

56

67
def word_occurence(sentence: str) -> dict:
@@ -14,7 +15,7 @@ def word_occurence(sentence: str) -> dict:
1415
>>> dict(word_occurence("Two spaces"))
1516
{'Two': 1, 'spaces': 1}
1617
"""
17-
occurrence: dict = defaultdict(int)
18+
occurrence: DefaultDict[str, int] = defaultdict(int)
1819
# Creating a dictionary containing count of each word
1920
for word in sentence.split():
2021
occurrence[word] += 1

strings/z_function.py

Lines changed: 3 additions & 3 deletions

0 commit comments

Comments
 (0)