Source code for CrackingCodesWithPython.Chapter17.makeWordPatterns

"""Make wordPatterns.py file

Creates :py:mod:`CrackingCodesWithPython.Chapter17.wordPatterns` based on the words in our dictionary text file,
dictionary.txt. A word pattern assigns a number to each letter in a word, then generates a pattern representation of
that word based on the number assigned to each letter.

Attributes:
    DICTIONARY_FILE (str): String containing absolute path to dictionary.txt file.

Note:
    * Download the dictionary file from https://invpy.com/dictionary.txt
    * https://www.nostarch.com/crackingcodes (BSD Licensed)
"""

import pprint

DICTIONARY_FILE = '/home/jose/PycharmProjects/python-tutorials/pythontutorials/books/CrackingCodesWithPython/Chapter11/dictionary.txt'


[docs]def getWordPattern(word: str) -> str: """Get word pattern Returns a string of the pattern form of the given word. Args: word: String containing word to convert into word pattern. Example: >>> import pythontutorials.books.CrackingCodesWithPython.Chapter17.makeWordPatterns as makeWordPatterns >>> makeWordPatterns.getWordPattern('DUSTBUSTER') '0.1.2.3.4.1.2.3.5.6' Returns: String containing word pattern. """ word = word.upper() nextNum = 0 letterNums = {} wordPattern = [] for letter in word: if letter not in letterNums: letterNums[letter] = str(nextNum) nextNum += 1 wordPattern.append(letterNums[letter]) return '.'.join(wordPattern)
[docs]def main(): allPatterns = {} fo = open(DICTIONARY_FILE) wordList = fo.read().split('\n') fo.close() for word in wordList: # Get the pattern for each string in wordList: pattern = getWordPattern(word) if pattern not in allPatterns: allPatterns[pattern] = [word] else: allPatterns[pattern].append(word) # This is code that writes code. The wordPatterns.py file contains # one very, very large assignment statement: fo = open('wordPatterns.py', 'w') fo.write('allPatterns = ') fo.write(pprint.pformat(allPatterns)) fo.close()
if __name__ == '__main__': main()