forked from TheAlgorithms/Python
- Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathfrequency_finder.py
103 lines (82 loc) · 2.39 KB
/
frequency_finder.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
# Frequency Finder
importstring
# frequency taken from https://en.wikipedia.org/wiki/Letter_frequency
english_letter_freq= {
"E": 12.70,
"T": 9.06,
"A": 8.17,
"O": 7.51,
"I": 6.97,
"N": 6.75,
"S": 6.33,
"H": 6.09,
"R": 5.99,
"D": 4.25,
"L": 4.03,
"C": 2.78,
"U": 2.76,
"M": 2.41,
"W": 2.36,
"F": 2.23,
"G": 2.02,
"Y": 1.97,
"P": 1.93,
"B": 1.29,
"V": 0.98,
"K": 0.77,
"J": 0.15,
"X": 0.15,
"Q": 0.10,
"Z": 0.07,
}
ETAOIN="ETAOINSHRDLCUMWFGYPBVKJXQZ"
LETTERS="ABCDEFGHIJKLMNOPQRSTUVWXYZ"
defget_letter_count(message: str) ->dict[str, int]:
letter_count=dict.fromkeys(string.ascii_uppercase, 0)
forletterinmessage.upper():
ifletterinLETTERS:
letter_count[letter] +=1
returnletter_count
defget_item_at_index_zero(x: tuple) ->str:
returnx[0]
defget_frequency_order(message: str) ->str:
"""
Get the frequency order of the letters in the given string
>>> get_frequency_order('Hello World')
'LOWDRHEZQXJKVBPYGFMUCSNIAT'
>>> get_frequency_order('Hello@')
'LHOEZQXJKVBPYGFWMUCDRSNIAT'
>>> get_frequency_order('h')
'HZQXJKVBPYGFWMUCLDRSNIOATE'
"""
letter_to_freq=get_letter_count(message)
freq_to_letter: dict[int, list[str]] = {
freq: [] forletter, freqinletter_to_freq.items()
}
forletterinLETTERS:
freq_to_letter[letter_to_freq[letter]].append(letter)
freq_to_letter_str: dict[int, str] = {}
forfreqinfreq_to_letter: # noqa: PLC0206
freq_to_letter[freq].sort(key=ETAOIN.find, reverse=True)
freq_to_letter_str[freq] ="".join(freq_to_letter[freq])
freq_pairs=list(freq_to_letter_str.items())
freq_pairs.sort(key=get_item_at_index_zero, reverse=True)
freq_order: list[str] = [freq_pair[1] forfreq_pairinfreq_pairs]
return"".join(freq_order)
defenglish_freq_match_score(message: str) ->int:
"""
>>> english_freq_match_score('Hello World')
1
"""
freq_order=get_frequency_order(message)
match_score=0
forcommon_letterinETAOIN[:6]:
ifcommon_letterinfreq_order[:6]:
match_score+=1
foruncommon_letterinETAOIN[-6:]:
ifuncommon_letterinfreq_order[-6:]:
match_score+=1
returnmatch_score
if__name__=="__main__":
importdoctest
doctest.testmod()