Ryan is an engineer in the Sacramento Area with a focus in Python, Ruby, and Rust. Bash/Python Exercism mentor. Coding, physics, calculus, music, woodworking. Looking for work!
Nice! Thanks for sharing. :) Have you seen the built-in Counter class? This seems like a perfect use-case for it.
fromcollectionsimportCounterblob="..."letters="abcdefghijklmnopqrstuvwxyz_"defmessage(letters,blob):hist=Counter(blob)# Counter takes any iterable and makes# a histogram of its items!sorted_letters=''.join(x[0]forxinhist.most_common())returnsorted_letters.split('_')[0]print(message(letters,blob))
I wondered if I could do better performance-wise, based on knowledge of the problem that the more general built-in classes couldn't take advantage of. Ended up with this:
import string
longString="..."
def decode(msg):
# Testing suggests this is a little faster than using defaultdict
charCountHash = {}.fromkeys(string.ascii_lowercase,0)
charCountHash['_'] = 0
for ch in msg:
charCountHash[ch] += 1
c = charCountHash['_']
resultHash = {charCountHash[k]: k for k in charCountHash.keys() \
if charCountHash[k] > c }
return ''.join( [ resultHash[index] for index in \
sorted(resultHash.keys(), reverse=True) ] )
print(decode(longString))
Testing both implementations a few times suggests this way is faster, but only 1% or so.
Ryan is an engineer in the Sacramento Area with a focus in Python, Ruby, and Rust. Bash/Python Exercism mentor. Coding, physics, calculus, music, woodworking. Looking for work!
Nice! I haven't used fromkeys before. That's a nice alternative to defaultdict (and you don't have to import anything!) if you already know the keys you need.
Ryan is an engineer in the Sacramento Area with a focus in Python, Ruby, and Rust. Bash/Python Exercism mentor. Coding, physics, calculus, music, woodworking. Looking for work!
Nice! Thanks for sharing. :) Have you seen the built-in Counter class? This seems like a perfect use-case for it.
I wondered if I could do better performance-wise, based on knowledge of the problem that the more general built-in classes couldn't take advantage of. Ended up with this:
Testing both implementations a few times suggests this way is faster, but only 1% or so.
Might try this in go, just for the practice...
Nice! I haven't used
fromkeys
before. That's a nice alternative to defaultdict (and you don't have to import anything!) if you already know the keys you need.Bonus! On my machine, this version is even 5 times faster than the best Ruby version!
This is great. Will use counter effectively. Thanks for showing me counter(). :-)