word count engine

🏠

https://www.pramp.com/challenge/W5EJq2Jld3t2ny9jyZXG

Nailed it.

 1from collections import defaultdict
 2
 3class Entry:
 4
 5  def __init__(self, count, first_pos):
 6    self.count = count
 7    self.first_pos = first_pos
 8  
 9  def __lt__(self, other):
10    if self.count == other.count:
11      return self.first_pos > other.first_pos
12    return self.count < other.count
13
14def word_count_engine(document):
15  c = {}
16  for i, w in enumerate(document.split(' ')):
17    w = ''.join(filter(str.isalnum, w)).lower()
18    if w:
19      if w in c:
20        c[w].count += 1
21      else:
22        c[w] = Entry(1, i)
23  words_sorted = sorted(c.items(), key=lambda x: x[1], reverse=True)
24  return [[w, str(e.count)] for w, e in words_sorted]
25
26# time: O(n^2 + nlogn)
27# space: O(n)
28
29document = "Practice makes perfect. you'll only get Perfect by practice. just practice!"
30output = [ ["practice", "3"], ["perfect", "2"], ["makes", "1"], ["youll", "1"], ["only", "1"], 
31          ["get", "1"], ["by", "1"], ["just", "1"] ]
32
33r = word_count_engine(document)
34print(r)