2024-heraklion-data/exercises/anagrams/anagrams_solution.ipynb

1452 lines
60 KiB
Plaintext
Raw Normal View History

2024-08-27 14:27:53 +02:00
{
"cells": [
{
"cell_type": "markdown",
"id": "245d99ab",
"metadata": {},
"source": [
"# Exercise: Find the anagrams for all words in a list"
]
},
{
"attachments": {},
"cell_type": "markdown",
"id": "d1e46c4a",
"metadata": {},
"source": [
"* You are given an English dictionary containing M words (“the dictionary”), and a separate list of N words (“the input”, saved in the file `words_to_search.txt`)\n",
"* For each word in the input, find all the anagrams in the dictionary (e.g., for input 'acme' the anagrams are `['acme', 'came', 'mace']`)\n",
"\n",
"How to proceed?\n",
"1. Write an algorithm to find all anagrams for one input word first\n",
"2. What is the Big-O class of this algorithm when executed the full N-words input?\n",
"3. Is there a way to pre-process the dictionary to improve the Big-O performance?"
]
},
{
"cell_type": "markdown",
"id": "b9b9cecd",
"metadata": {},
"source": [
"# 1. Load the system dictionary and the input words"
]
},
{
"cell_type": "code",
"execution_count": 7,
"id": "24070a26",
"metadata": {},
"outputs": [],
"source": [
"# Load the system dictionary\n",
"with open('/usr/share/dict/words', 'r') as f:\n",
" dict_words = [w.strip() for w in f.readlines()]"
]
},
{
"cell_type": "code",
"execution_count": 8,
"id": "4002fcdd",
"metadata": {
"scrolled": true
},
"outputs": [
{
"data": {
"text/plain": [
"['A',\n",
" 'a',\n",
" 'aa',\n",
" 'aal',\n",
" 'aalii',\n",
" '...',\n",
" 'zythem',\n",
" 'Zythia',\n",
" 'zythum',\n",
" 'Zyzomys',\n",
" 'Zyzzogeton']"
]
},
"execution_count": 8,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"# Print the start and end of the dictionary\n",
"dict_words[:5] + ['...'] + dict_words[-5:]"
]
},
{
"cell_type": "code",
"execution_count": 13,
"id": "823537ef",
"metadata": {},
"outputs": [],
"source": [
"# Load the input words\n",
"with open('words_to_search.txt', 'r') as f:\n",
" words = [w.strip() for w in f.readlines()]"
]
},
{
"cell_type": "code",
"execution_count": 14,
"id": "4ccec6a3",
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"['acer',\n",
" 'acers',\n",
" 'aces',\n",
" 'aches',\n",
" 'acme',\n",
" '...',\n",
" 'yap',\n",
" 'yaw',\n",
" 'yea',\n",
" 'zendo',\n",
" 'zoned']"
]
},
"execution_count": 14,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"# Print the start and end of the input list\n",
"words[:5] + ['...'] + words[-5:]"
]
},
{
"cell_type": "markdown",
"id": "14d91685",
"metadata": {},
"source": [
"# 2. Look for the anagrams of one input word, e.g. \"organ\"\n",
"\n",
"* There are several anagrams, including \"groan\" and \"argon\".\n",
"\n",
"* What is the Big-O performance oh your algorithm? In terms of M, the number of words in the dictionary, and K, the number of letters in a word"
]
},
{
"cell_type": "code",
"execution_count": 15,
"id": "badf44c1",
"metadata": {},
"outputs": [],
"source": [
"word = 'organ'"
]
},
{
"cell_type": "code",
"execution_count": 16,
"id": "551e6b54",
"metadata": {},
"outputs": [],
"source": [
"anagrams = []\n",
"for dict_word in dict_words: # O(M)\n",
" if sorted(word) == sorted(dict_word): # 2 * O(K log K) ~ O(K log K)\n",
" anagrams.append(dict_word) # O(1)"
]
},
{
"cell_type": "code",
"execution_count": 17,
"id": "84294a2f",
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"['angor',\n",
" 'argon',\n",
" 'goran',\n",
" 'grano',\n",
" 'groan',\n",
" 'nagor',\n",
" 'orang',\n",
" 'organ',\n",
" 'rogan']"
]
},
"execution_count": 17,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"anagrams"
]
},
{
"cell_type": "markdown",
"id": "7cd1196c",
"metadata": {},
"source": [
"The performance of this implementation is O(M * K log K).\n",
"\n",
"Note that instead of sorting , we could use a dictionary mapping letters to letter counts. This would make the performance even better, O(M * K)! However, in practice it would make little difference and would make the code more complicated, so we'll leave it like this."
]
},
{
"cell_type": "markdown",
"id": "115c3219",
"metadata": {},
"source": [
"# 3. Look for the anagrams of the words in the input list\n",
"\n",
"* How does the Big-O performance of your one-word implementation scale to an input list of M words?\n",
"* Is there a way to pre-process the dictionary words in a data structure that is better suited for this task?"
]
},
{
"cell_type": "code",
"execution_count": 18,
"id": "e00054ff",
"metadata": {},
"outputs": [
{
"ename": "KeyboardInterrupt",
"evalue": "",
"output_type": "error",
"traceback": [
"\u001b[0;31m---------------------------------------------------------------------------\u001b[0m",
"\u001b[0;31mKeyboardInterrupt\u001b[0m Traceback (most recent call last)",
"Cell \u001b[0;32mIn[18], line 12\u001b[0m\n\u001b[1;32m 10\u001b[0m words_anagrams \u001b[38;5;241m=\u001b[39m []\n\u001b[1;32m 11\u001b[0m \u001b[38;5;28;01mfor\u001b[39;00m word \u001b[38;5;129;01min\u001b[39;00m words: \u001b[38;5;66;03m# O(M)\u001b[39;00m\n\u001b[0;32m---> 12\u001b[0m anagrams \u001b[38;5;241m=\u001b[39m find_anagrams(word, dict_words)\n\u001b[1;32m 13\u001b[0m words_anagrams\u001b[38;5;241m.\u001b[39mappend((word, anagrams))\n",
"Cell \u001b[0;32mIn[18], line 6\u001b[0m, in \u001b[0;36mfind_anagrams\u001b[0;34m(word, dict_words)\u001b[0m\n\u001b[1;32m 4\u001b[0m anagrams \u001b[38;5;241m=\u001b[39m []\n\u001b[1;32m 5\u001b[0m \u001b[38;5;28;01mfor\u001b[39;00m dict_word \u001b[38;5;129;01min\u001b[39;00m dict_words: \u001b[38;5;66;03m# O(N)\u001b[39;00m\n\u001b[0;32m----> 6\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m \u001b[38;5;28msorted\u001b[39m(word) \u001b[38;5;241m==\u001b[39m \u001b[38;5;28msorted\u001b[39m(dict_word): \u001b[38;5;66;03m# O(K log K)\u001b[39;00m\n\u001b[1;32m 7\u001b[0m anagrams\u001b[38;5;241m.\u001b[39mappend(dict_word) \u001b[38;5;66;03m# O(1)\u001b[39;00m\n\u001b[1;32m 8\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m anagrams\n",
"\u001b[0;31mKeyboardInterrupt\u001b[0m: "
]
}
],
"source": [
"# Naive implementation, it takes a long time\n",
"\n",
"def find_anagrams(word, dict_words):\n",
" anagrams = []\n",
" for dict_word in dict_words: # O(N)\n",
" if sorted(word) == sorted(dict_word): # O(K log K)\n",
" anagrams.append(dict_word) # O(1)\n",
" return anagrams\n",
"\n",
"words_anagrams = []\n",
"for word in words: # O(M)\n",
" anagrams = find_anagrams(word, dict_words)\n",
" words_anagrams.append((word, anagrams)) # O(1)"
]
},
{
"cell_type": "markdown",
"id": "297fdc78",
"metadata": {},
"source": [
"The complexity of this algorithm is O(M * N * KlogK), where M is the length of the list of words to search, N is the length of words in the dictionary, and K is the length of words."
]
},
{
"cell_type": "markdown",
"id": "48947a28",
"metadata": {},
"source": [
"# What if we pre-process the dictionary in a data structure that is better suited for this task?"
]
},
{
"cell_type": "code",
"execution_count": 19,
"id": "3ad5dccd",
"metadata": {},
"outputs": [],
"source": [
"anagrams_map = {}\n",
"for dict_word in dict_words: # O(N)\n",
" letters = tuple(sorted(dict_word)) # O(K log K)\n",
" if letters not in anagrams_map: # O(1)\n",
" anagrams_map[letters] = [] # O(1)\n",
" anagrams_map[letters].append(dict_word) # O(1)"
]
},
{
"cell_type": "code",
"execution_count": 20,
"id": "786fec1b",
"metadata": {},
"outputs": [],
"source": [
"words_anagrams = []\n",
"final_words = []\n",
"for word in words: # O(M)\n",
" letters = tuple(sorted(word)) # O(K log K)\n",
" if letters not in anagrams_map: # O(1)\n",
" print('This word is not in the system dictionary -- skipping', word)\n",
" continue\n",
" else:\n",
" final_words.append(word)\n",
" words_anagrams.append((word, anagrams_map[letters])) # O(1)"
]
},
{
"cell_type": "code",
"execution_count": 21,
"id": "dda842a1",
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"[('acer', ['acre', 'care', 'crea', 'race']),\n",
" ('acers', ['carse', 'caser', 'ceras', 'scare', 'scrae']),\n",
" ('aces', ['case', 'esca']),\n",
" ('aches', ['chase']),\n",
" ('acme', ['acme', 'came', 'mace']),\n",
" ('acned', ['dance', 'decan']),\n",
" ('acre', ['acre', 'care', 'crea', 'race']),\n",
" ('acres', ['carse', 'caser', 'ceras', 'scare', 'scrae']),\n",
" ('act', ['act', 'cat']),\n",
" ('acts', ['cast', 'scat']),\n",
" ('acyl', ['acyl', 'clay', 'lacy']),\n",
" ('add', ['add', 'dad']),\n",
" ('adverb', ['adverb']),\n",
" ('aesc', ['case', 'esca']),\n",
" ('aether', ['heater', 'hereat', 'reheat']),\n",
" ('aethers', ['thereas']),\n",
" ('afield', ['afield', 'defial']),\n",
" ('aft', ['aft', 'fat']),\n",
" ('agree', ['agree', 'eager', 'eagre']),\n",
" ('agrees', ['grease']),\n",
" ('ags', ['gas', 'sag']),\n",
" ('ah', ['ah', 'ha']),\n",
" ('ahs', ['ash', 'sah', 'sha']),\n",
" ('aide', ['aide', 'idea']),\n",
" ('aides', ['aside']),\n",
" ('airings', ['raising']),\n",
" ('airmen', ['marine', 'remain']),\n",
" ('alloy', ['alloy', 'loyal']),\n",
" ('almes', ['amsel', 'mesal', 'samel']),\n",
" ('alp', ['alp', 'lap', 'pal']),\n",
" ('alps', ['salp', 'slap']),\n",
" ('altern', ['altern', 'antler', 'learnt', 'rental', 'ternal']),\n",
" ('altrices', ['altrices', 'selictar']),\n",
" ('alts', ['last', 'salt', 'slat']),\n",
" ('am', ['am', 'ma']),\n",
" ('amen', ['amen', 'enam', 'mane', 'mean', 'name', 'nema']),\n",
" ('amp', ['amp', 'map', 'pam']),\n",
" ('amps', ['samp', 'spam']),\n",
" ('anglist', ['lasting', 'salting', 'slating', 'staling']),\n",
" ('anils', ['sinal', 'slain', 'snail']),\n",
" ('ant', ['ant', 'nat', 'tan']),\n",
" ('antis', ['saint', 'satin', 'stain']),\n",
" ('antler', ['altern', 'antler', 'learnt', 'rental', 'ternal']),\n",
" ('antlers', ['saltern', 'starnel', 'sternal']),\n",
" ('any', ['any', 'nay', 'yan']),\n",
" ('ape', ['ape', 'pea']),\n",
" ('aper', ['aper', 'pare', 'pear', 'rape', 'reap']),\n",
" ('apt', ['apt', 'pat', 'tap']),\n",
" ('arb', ['bar', 'bra', 'rab']),\n",
" ('arc', ['arc', 'car']),\n",
" ('arcs', ['scar']),\n",
" ('are', ['aer', 'are', 'ear', 'era', 'rea']),\n",
" ('ared', ['ared', 'daer', 'dare', 'dear', 'read']),\n",
" ('ares', ['arse', 'rase', 'sare', 'sear', 'sera']),\n",
" ('argle', ['argel', 'ergal', 'garle', 'glare', 'lager', 'large', 'regal']),\n",
" ('aril', ['aril', 'lair', 'lari', 'liar', 'lira', 'rail', 'rial']),\n",
" ('arising', ['raising']),\n",
" ('arm', ['arm', 'mar', 'ram']),\n",
" ('armpit', ['armpit', 'impart']),\n",
" ('arms', ['arms']),\n",
" ('arse', ['arse', 'rase', 'sare', 'sear', 'sera']),\n",
" ('art', ['art', 'rat', 'tar', 'tra']),\n",
" ('article', ['article', 'recital']),\n",
" ('articles', ['altrices', 'selictar']),\n",
" ('arts', ['sart', 'star', 'stra', 'tars', 'tsar']),\n",
" ('arty', ['arty', 'atry', 'tray']),\n",
" ('ash', ['ash', 'sah', 'sha']),\n",
" ('aside', ['aside']),\n",
" ('aspired', ['despair', 'pardesi']),\n",
" ('asps', ['pass']),\n",
" ('ate', ['ate', 'eat', 'eta', 'tae', 'tea']),\n",
" ('ates', ['ates', 'east', 'eats', 'sate', 'seat', 'seta']),\n",
" ('atoners', ['noreast', 'rosetan', 'seatron', 'senator', 'treason']),\n",
" ('attic', ['attic', 'tacit']),\n",
" ('aves', ['save', 'vase']),\n",
" ('aye', ['aye', 'yea']),\n",
" ('backward', ['backward', 'drawback']),\n",
" ('bad', ['bad', 'dab']),\n",
" ('bag', ['bag', 'gab']),\n",
" ('bake', ['bake', 'beak']),\n",
" ('baker', ['baker', 'brake', 'break']),\n",
" ('balm', ['balm', 'lamb']),\n",
" ('bar', ['bar', 'bra', 'rab']),\n",
" ('bare', ['bare', 'bear', 'brae']),\n",
" ('bast', ['bast', 'bats', 'stab']),\n",
" ('bat', ['bat', 'tab']),\n",
" ('batlet', ['battel', 'battle', 'tablet']),\n",
" ('bats', ['bast', 'bats', 'stab']),\n",
" ('battel', ['battel', 'battle', 'tablet']),\n",
" ('battle', ['battel', 'battle', 'tablet']),\n",
" ('beak', ['bake', 'beak']),\n",
" ('bear', ['bare', 'bear', 'brae']),\n",
" ('begin', ['begin', 'being', 'binge']),\n",
" ('being', ['begin', 'being', 'binge']),\n",
" ('below', ['below', 'bowel', 'elbow']),\n",
" ('best', ['best']),\n",
" ('bets', ['best']),\n",
" ('binge', ['begin', 'being', 'binge']),\n",
" ('blam', ['balm', 'lamb']),\n",
" ('blot', ['blot', 'bolt']),\n",
" ('blow', ['blow', 'bowl']),\n",
" ('bludier', ['builder', 'rebuild']),\n",
" ('bluest', ['bustle', 'sublet', 'subtle']),\n",
" ('bluets', ['bustle', 'sublet', 'subtle']),\n",
" ('bolt', ['blot', 'bolt']),\n",
" ('bombed', ['bombed']),\n",
" ('borde', ['boder', 'orbed']),\n",
" ('bored', ['boder', 'orbed']),\n",
" ('bores', ['boser', 'brose', 'sober']),\n",
" ('boss', ['boss']),\n",
" ('bourne', ['unrobe']),\n",
" ('bowel', ['below', 'bowel', 'elbow']),\n",
" ('bowl', ['blow', 'bowl']),\n",
" ('bra', ['bar', 'bra', 'rab']),\n",
" ('brae', ['bare', 'bear', 'brae']),\n",
" ('brag', ['brag', 'garb', 'grab']),\n",
" ('brake', ['baker', 'brake', 'break']),\n",
" ('braved', ['adverb']),\n",
" ('break', ['baker', 'brake', 'break']),\n",
" ('brief', ['bifer', 'brief', 'fiber']),\n",
" ('brose', ['boser', 'brose', 'sober']),\n",
" ('brush', ['brush', 'shrub']),\n",
" ('buhrs', ['brush', 'shrub']),\n",
" ('builder', ['builder', 'rebuild']),\n",
" ('burden', ['bunder', 'burden', 'burned', 'unbred']),\n",
" ('burned', ['bunder', 'burden', 'burned', 'unbred']),\n",
" ('bury', ['bury', 'ruby']),\n",
" ('bush', ['bush']),\n",
" ('bust', ['bust', 'stub']),\n",
" ('bustle', ['bustle', 'sublet', 'subtle']),\n",
" ('but', ['but', 'tub']),\n",
" ('butles', ['bustle', 'sublet', 'subtle']),\n",
" ('buts', ['bust', 'stub']),\n",
" ('cab', ['bac', 'cab']),\n",
" ('cabs', ['scab']),\n",
" ('cadres', ['sacred']),\n",
" ('cafe', ['face']),\n",
" ('caller', ['caller', 'cellar', 'recall']),\n",
" ('calm', ['calm', 'clam']),\n",
" ('calo', ['alco', 'coal', 'cola', 'loca']),\n",
" ('came', ['acme', 'came', 'mace']),\n",
" ('caned', ['dance', 'decan']),\n",
" ('canoe', ['acone', 'canoe', 'ocean']),\n",
" ('cans', ['scan']),\n",
" ('cape', ['cape', 'cepa', 'pace']),\n",
" ('car', ['arc', 'car']),\n",
" ('care', ['acre', 'care', 'crea', 'race']),\n",
" ('cares', ['carse', 'caser', 'ceras', 'scare', 'scrae']),\n",
" ('caret',\n",
" ['caret',\n",
" 'carte',\n",
" 'cater',\n",
" 'crate',\n",
" 'creat',\n",
" 'creta',\n",
" 'react',\n",
" 'recta',\n",
" 'trace']),\n",
" ('carol', ['calor', 'carol', 'claro', 'coral']),\n",
" ('carp', ['carp', 'crap']),\n",
" ('cars', ['scar']),\n",
" ('carse', ['carse', 'caser', 'ceras', 'scare', 'scrae']),\n",
" ('carte',\n",
" ['caret',\n",
" 'carte',\n",
" 'cater',\n",
" 'crate',\n",
" 'creat',\n",
" 'creta',\n",
" 'react',\n",
" 'recta',\n",
" 'trace']),\n",
" ('case', ['case', 'esca']),\n",
" ('cask', ['cask', 'sack']),\n",
" ('cast', ['cast', 'scat']),\n",
" ('cat', ['act', 'cat']),\n",
" ('cater',\n",
" ['caret',\n",
" 'carte',\n",
" 'cater',\n",
" 'crate',\n",
" 'creat',\n",
" 'creta',\n",
" 'react',\n",
" 'recta',\n",
" 'trace']),\n",
" ('cats', ['cast', 'scat']),\n",
" ('cause', ['cause', 'sauce']),\n",
" ('causes', ['causse']),\n",
" ('ceas', ['case', 'esca']),\n",
" ('cedars', ['sacred']),\n",
" ('cedi', ['dice', 'iced']),\n",
" ('cellar', ['caller', 'cellar', 'recall']),\n",
" ('cents', ['scent']),\n",
" ('cereus', ['ceruse', 'recuse', 'rescue', 'secure']),\n",
" ('ceruse', ['ceruse', 'recuse', 'rescue', 'secure']),\n",
" ('cesure', ['ceruse', 'recuse', 'rescue', 'secure']),\n",
" ('charm', ['charm', 'march']),\n",
" ('charmer', ['charmer', 'marcher', 'remarch']),\n",
" ('charming', ['charming']),\n",
" ('chase', ['chase']),\n",
" ('cheating', ['cheating', 'teaching']),\n",
" ('chetnik', ['kitchen', 'thicken']),\n",
" ('chin', ['chin', 'inch']),\n",
" ('chit', ['chit', 'itch']),\n",
" ('chum', ['chum', 'much']),\n",
" ('cion', ['cion', 'coin', 'icon']),\n",
" ('citrus', ['citrus', 'rictus', 'rustic']),\n",
" ('clam', ['calm', 'clam']),\n",
" ('claro', ['calor', 'carol', 'claro', 'coral']),\n",
" ('clay', ['acyl', 'clay', 'lacy']),\n",
" ('cloud', ['cloud', 'could']),\n",
" ('coal', ['alco', 'coal', 'cola', 'loca']),\n",
" ('cocaine', ['cocaine', 'oceanic']),\n",
" ('cod', ['cod', 'doc']),\n",
" ('coin', ['cion', 'coin', 'icon']),\n",
" ('cola', ['alco', 'coal', 'cola', 'loca']),\n",
" ('comics', ['cosmic']),\n",
" ('cone', ['cone', 'once']),\n",
" ('coni', ['cion', 'coin', 'icon']),\n",
" ('cool', ['cool', 'loco']),\n",
" ('coral', ['calor', 'carol', 'claro', 'coral']),\n",
" ('cork', ['cork', 'rock']),\n",
" ('corset', ['corset', 'coster', 'escort', 'scoter', 'sector']),\n",
" ('corvet', ['covert', 'vector']),\n",
" ('cosmic', ['cosmic']),\n",
" ('coster', ['corset', 'coster', 'escort', 'scoter', 'sector']),\n",
" ('could', ['cloud', 'could']),\n",
" ('covert', ['covert', 'vector']),\n",
" ('crap', ['carp', 'crap']),\n",
" ('crate',\n",
" ['caret',\n",
" 'carte',\n",
" 'cater',\n",
" 'crate',\n",
" 'creat',\n",
" 'creta',\n",
" 'react',\n",
" 'recta',\n",
" 'trace']),\n",
" ('crews', ['screw']),\n",
" ('dab', ['bad', 'dab']),\n",
" ('dad', ['add', 'dad']),\n",
" ('dah', ['dah', 'dha', 'had']),\n",
" ('dairy', ['dairy', 'diary', 'yaird']),\n",
" ('dale', ['dale', 'deal', 'lade', 'lead']),\n",
" ('dalets', ['desalt', 'salted']),\n",
" ('dali', ['dali', 'dial', 'laid']),\n",
" ('dam', ['dam', 'mad']),\n",
" ('dance', ['dance', 'decan']),\n",
" ('dare', ['ared', 'daer', 'dare', 'dear', 'read']),\n",
" ('dashed', ['dashed', 'shaded']),\n",
" ('dawn', ['dawn', 'wand']),\n",
" ('deaf', ['deaf', 'fade']),\n",
" ('deal', ['dale', 'deal', 'lade', 'lead']),\n",
" ('dealer', ['dealer', 'leader', 'redeal', 'relade', 'relead']),\n",
" ('dear', ['ared', 'daer', 'dare', 'dear', 'read']),\n",
" ('dearer', ['reader', 'redare', 'reread']),\n",
" ('death', ['death']),\n",
" ('deaws', ['sawed']),\n",
" ('declines', ['licensed', 'silenced']),\n",
" ('decree', ['decree', 'recede']),\n",
" ('deens', ['dense', 'needs']),\n",
" ('defer', ['defer', 'freed']),\n",
" ('deil', ['idle', 'lied']),\n",
" ('delayer', ['delayer', 'layered', 'redelay']),\n",
" ('deli', ['idle', 'lied']),\n",
" ('deltas', ['desalt', 'salted']),\n",
" ('denes', ['dense', 'needs']),\n",
" ('dense', ['dense', 'needs']),\n",
" ('denser', ['resend', 'sender']),\n",
" ('desalt', ['desalt', 'salted']),\n",
" ('deserver', ['deserver', 'reserved', 'reversed']),\n",
" ('despair', ['despair', 'pardesi']),\n",
" ('devote', ['devote']),\n",
" ('dew', ['dew', 'wed']),\n",
" ('dial', ['dali', 'dial', 'laid']),\n",
" ('diaper', ['diaper', 'paired']),\n",
" ('diapers', ['despair', 'pardesi']),\n",
" ('diary', ['dairy', 'diary', 'yaird']),\n",
" ('dice', ['dice', 'iced']),\n",
" ('diel', ['idle', 'lied']),\n",
" ('diet', ['diet', 'dite', 'edit', 'tide', 'tied']),\n",
" ('dikes', ['skied']),\n",
" ('dimple', ['dimple']),\n",
" ('direr', ['drier', 'rider']),\n",
" ('disease', ['disease', 'seaside']),\n",
" ('disk', ['disk', 'skid']),\n",
" ('dite', ['diet', 'dite', 'edit', 'tide', 'tied']),\n",
" ('doc', ['cod', 'doc']),\n",
" ('doen', ['done', 'node']),\n",
" ('dog', ['dog', 'god']),\n",
" ('dogs', ['dogs']),\n",
" ('don', ['don', 'nod']),\n",
" ('done', ['done', 'node']),\n",
" ('doom', ['doom', 'mood']),\n",
" ('dozen', ['dozen', 'zoned']),\n",
" ('draw', ['draw', 'ward']),\n",
" ('drawback', ['backward', 'drawback']),\n",
" ('dreare', ['reader', 'redare', 'reread']),\n",
" ('drier', ['drier', 'rider']),\n",
" ('dune', ['dune', 'nude', 'unde']),\n",
" ('dunite', ['dunite', 'united', 'untied']),\n",
" ('dusty', ['dusty', 'study']),\n",
" ('eager', ['agree', 'eager', 'eagre']),\n",
" ('eagers', ['grease']),\n",
" ('eagre', ['agree', 'eager', 'eagre']),\n",
" ('eagres', ['grease']),\n",
" ('ear', ['aer', 'are', 'ear', 'era', 'rea']),\n",
" ('eard', ['ared', 'daer', 'dare', 'dear', 'read']),\n",
" ('early', ['early', 'layer', 'relay']),\n",
" ('earn', ['earn', 'near', 'rane']),\n",
" ('earner', ['earner']),\n",
" ('ears', ['arse', 'rase', 'sare', 'sear', 'sera']),\n",
" ('earthy', ['earthy', 'hearty', 'yearth']),\n",
" ('east', ['ates', 'east', 'eats', 'sate', 'seat', 'seta']),\n",
" ('eastling', ['genitals', 'stealing']),\n",
" ('eat', ['ate', 'eat', 'eta', 'tae', 'tea']),\n",
" ('eath', ['haet', 'hate', 'heat']),\n",
" ('eats', ['ates', 'east', 'eats', 'sate', 'seat', 'seta']),\n",
" ('edit', ['diet', 'dite', 'edit', 'tide', 'tied']),\n",
" ('eel', ['eel', 'lee']),\n",
" ('egos', ['goes', 'sego']),\n",
" ('eh', ['eh', 'he']),\n",
" ('eild', ['idle', 'lied']),\n",
" ('elbow', ['below', 'bowel', 'elbow']),\n",
" ('elints', ['enlist', 'listen', 'silent', 'tinsel']),\n",
" ('emit', ['emit', 'item', 'mite', 'time']),\n",
" ('emits', ['metis', 'smite', 'stime', 'times']),\n",
" ('emoter', ['meteor', 'remote']),\n",
" ('enders', ['resend', 'sender']),\n",
" ('enfiring', ['infringe', 'refining']),\n",
" ('enlist', ['enlist', 'listen', 'silent', 'tinsel']),\n",
" ('enlisted', ['enlisted', 'lintseed']),\n",
" ('era', ['aer', 'are', 'ear', 'era', 'rea']),\n",
" ('eras', ['arse', 'rase', 'sare', 'sear', 'sera']),\n",
" ('eros', ['eros', 'rose', 'sero', 'sore']),\n",
" ('escar', ['carse', 'caser', 'ceras', 'scare', 'scrae']),\n",
" ('escort', ['corset', 'coster', 'escort', 'scoter', 'sector']),\n",
" ('ester',\n",
" ['ester',\n",
" 'estre',\n",
" 'reest',\n",
" 'reset',\n",
" 'steer',\n",
" 'stere',\n",
" 'stree',\n",
" 'terse',\n",
" 'tsere']),\n",
" ('eta', ['ate', 'eat', 'eta', 'tae', 'tea']),\n",
" ('etas', ['ates', 'east', 'eats', 'sate', 'seat', 'seta']),\n",
" ('ether', ['ether', 'rethe', 'theer', 'there', 'three']),\n",
" ('evil', ['evil', 'live', 'veil', 'vile', 'vlei']),\n",
" ('evils', ['slive']),\n",
" ('ewts', ['stew', 'west']),\n",
" ('except', ['except', 'expect']),\n",
" ('exist', ['exist', 'sixte']),\n",
" ('exits', ['exist', 'sixte']),\n",
" ('expect', ['except', 'expect']),\n",
" ('face', ['face']),\n",
" ('fade', ['deaf', 'fade']),\n",
" ('failed', ['afield', 'defial']),\n",
" ('faker', ['faker', 'freak']),\n",
" ('fare', ['fare', 'fear', 'frae']),\n",
" ('farmed', ['framed']),\n",
" ('farming', ['farming', 'framing']),\n",
" ('fast', ['fast', 'saft']),\n",
" ('fat', ['aft', 'fat']),\n",
" ('fate', ['atef', 'fate', 'feat']),\n",
" ('fats', ['fast', 'saft']),\n",
" ('fear', ['fare', 'fear', 'frae']),\n",
" ('feat', ['atef', 'fate', 'feat']),\n",
" ('feel', ['feel', 'flee']),\n",
" ('feer', ['feer', 'free', 'reef']),\n",
" ('felid', ['felid', 'field']),\n",
" ('felt', ['felt', 'flet', 'left']),\n",
" ('fere', ['feer', 'free', 'reef']),\n",
" ('feta', ['atef', 'fate', 'feat']),\n",
" ('fiber', ['bifer', 'brief', 'fiber']),\n",
" ('fibre', ['bifer', 'brief', 'fiber']),\n",
" ('field', ['felid', 'field']),\n",
" ('filed', ['felid', 'field']),\n",
" ('filer', ['filer', 'flier', 'lifer', 'rifle']),\n",
" ('filets', ['itself', 'stifle']),\n",
" ('filler', ['filler', 'refill']),\n",
" ('finder', ['finder', 'friend', 'redfin', 'refind']),\n",
" ('finer', ['finer', 'infer']),\n",
" ('finger', ['finger', 'fringe']),\n",
" ('fired', ['fired', 'fried']),\n",
" ('fires', ['serif']),\n",
" ('fist', ['fist', 'sift']),\n",
" ('fitness', ['fitness']),\n",
" ('fits', ['fist', 'sift']),\n",
" ('flee', ['feel', 'flee']),\n",
" ('flesh', ['flesh', 'shelf']),\n",
" ('flied', ['felid', 'field']),\n",
" ('flier', ['filer', 'flier', 'lifer', 'rifle']),\n",
" ('fliest', ['itself', 'stifle']),\n",
" ('flites', ['itself', 'stifle']),\n",
" ('flog', ['flog', 'golf']),\n",
" ('flow', ['flow', 'fowl', 'wolf']),\n",
" ('flue', ['flue', 'fuel']),\n",
" ('form', ['form', 'from']),\n",
" ('former', ['former', 'reform']),\n",
" ('forth', ['forth', 'froth']),\n",
" ('fowl', ['flow', 'fowl', 'wolf']),\n",
" ('frae', ['fare', 'fear', 'frae']),\n",
" ('framed', ['framed']),\n",
" ('framing', ['farming', 'framing']),\n",
" ('freak', ['faker', 'freak']),\n",
" ('free', ['feer', 'free', 'reef']),\n",
" ('freed', ['defer', 'freed']),\n",
" ('fried', ['fired', 'fried']),\n",
" ('friend', ['finder', 'friend', 'redfin', 'refind']),\n",
" ('fries', ['serif']),\n",
" ('fringe', ['finger', 'fringe']),\n",
" ('frise', ['serif']),\n",
" ('from', ['form', 'from']),\n",
" ('froth', ['forth', 'froth']),\n",
" ('fuel', ['flue', 'fuel']),\n",
" ('furs', ['surf']),\n",
" ('gab', ['bag', 'gab']),\n",
" ('gals', ['slag']),\n",
" ('gaps', ['gasp']),\n",
" ('garb', ['brag', 'garb', 'grab']),\n",
" ('gas', ['gas', 'sag']),\n",
" ('gasp', ['gasp']),\n",
" ('gater', ['gater', 'grate', 'great', 'retag', 'targe']),\n",
" ('geare', ['agree', 'eager', 'eagre']),\n",
" ('geares', ['grease']),\n",
" ('gel', ['gel', 'leg']),\n",
" ('gelatins', ['genitals', 'stealing']),\n",
" ('genitals', ['genitals', 'stealing']),\n",
" ('geos', ['goes', 'sego']),\n",
" ('girn', ['girn', 'grin', 'ring']),\n",
" ('glare', ['argel', 'ergal', 'garle', 'glare', 'lager', 'large', 'regal']),\n",
" ('god', ['dog', 'god']),\n",
" ('gods', ['dogs']),\n",
" ('goes', ['goes', 'sego']),\n",
" ('golf', ['flog', 'golf']),\n",
" ('grab', ['brag', 'garb', 'grab']),\n",
" ('grate', ['gater', 'grate', 'great', 'retag', 'targe']),\n",
" ('grease', ['grease']),\n",
" ('great', ['gater', 'grate', 'great', 'retag', 'targe']),\n",
" ('grin', ['girn', 'grin', 'ring']),\n",
" ('grues', ['surge']),\n",
" ('gulp', ['gulp', 'plug']),\n",
" ('gum', ['gum', 'mug']),\n",
" ('gunshot', ['gunshot', 'shotgun', 'uhtsong']),\n",
" ('gust', ['gust', 'stug']),\n",
" ('guts', ['gust', 'stug']),\n",
" ('ha', ['ah', 'ha']),\n",
" ('had', ['dah', 'dha', 'had']),\n",
" ('haet', ['haet', 'hate', 'heat']),\n",
" ('halls', ['shall']),\n",
" ('halses', ['hassel', 'hassle']),\n",
" ('hams', ['mash', 'samh', 'sham']),\n",
" ('hangover', ['overhang']),\n",
" ('harps', ['sharp', 'shrap']),\n",
" ('has', ['ash', 'sah', 'sha']),\n",
" ('hassel', ['hassel', 'hassle']),\n",
" ('hassle', ['hassel', 'hassle']),\n",
" ('hate', ['haet', 'hate', 'heat']),\n",
" ('hated', ['death']),\n",
" ('hay', ['hay', 'yah']),\n",
" ('he', ['eh', 'he']),\n",
" ('hearty', ['earthy', 'hearty', 'yearth']),\n",
" ('heat', ['haet', 'hate', 'heat']),\n",
" ('heater', ['heater', 'hereat', 'reheat']),\n",
" ('heaters', ['thereas']),\n",
" ('heir', ['heir', 'hire']),\n",
" ('heirs', ['hirse', 'shier', 'shire']),\n",
" ('hereat', ['heater', 'hereat', 'reheat']),\n",
" ('hewn', ['hewn', 'when']),\n",
" ('hikes', ['sheik']),\n",
" ('hire', ['heir', 'hire']),\n",
" ('hires', ['hirse', 'shier', 'shire']),\n",
" ('ho', ['ho', 'oh']),\n",
" ('hocks', ['shock']),\n",
" ('hoes', ['hose', 'shoe']),\n",
" ('hognuts', ['gunshot', 'shotgun', 'uhtsong']),\n",
" ('hooks', ['shook']),\n",
" ('hose', ['hose', 'shoe']),\n",
" ('host', ['host', 'shot', 'tosh']),\n",
" ('hots', ['host', 'shot', 'tosh']),\n",
" ('houts', ['shout', 'south']),\n",
" ('how', ['how', 'who']),\n",
" ('howres', ['shower']),\n",
" ('hubs', ['bush']),\n",
" ('hug', ['hug', 'ugh']),\n",
" ('hums', ['mush']),\n",
" ('hustle', ['hustle', 'sleuth']),\n",
" ('hustling', ['sunlight']),\n",
" ('huts', ['shut', 'thus', 'tush']),\n",
" ('iced', ['dice', 'iced']),\n",
" ('icon', ['cion', 'coin', 'icon']),\n",
" ('idea', ['aide', 'idea']),\n",
" ('ideas', ['aside']),\n",
" ('idle', ['idle', 'lied']),\n",
" ('impart', ['armpit', 'impart']),\n",
" ('impled', ['dimple']),\n",
" ('imprints', ['misprint']),\n",
" ('incest', ['encist', 'incest', 'insect', 'scient']),\n",
" ('inch', ['chin', 'inch']),\n",
" ('infer', ['finer', 'infer']),\n",
" ('infests', ['fitness']),\n",
" ('infringe', ['infringe', 'refining']),\n",
" ('ink', ['ink', 'kin']),\n",
" ('inks', ['inks', 'sink', 'skin']),\n",
" ('inlets', ['enlist', 'listen', 'silent', 'tinsel']),\n",
" ('ins', ['sin']),\n",
" ('insect', ['encist', 'incest', 'insect', 'scient']),\n",
" ('instar', ['instar', 'santir', 'strain']),\n",
" ('insult', ['insult', 'sunlit', 'unlist', 'unslit']),\n",
" ('itch', ['chit', 'itch']),\n",
" ('item', ['emit', 'item', 'mite', 'time']),\n",
" ('items', ['metis', 'smite', 'stime', 'times']),\n",
" ('its', ['ist', 'its', 'sit']),\n",
" ('itself', ['itself', 'stifle']),\n",
" ('jest', ['jest']),\n",
" ('jets', ['jest']),\n",
" ('joiner', ['joiner', 'rejoin']),\n",
" ('just', ['just']),\n",
" ('juts', ['just']),\n",
" ('kale', ['kale', 'lake', 'leak']),\n",
" ('kebar', ['baker', 'brake', 'break']),\n",
" ('keel', ['keel', 'kele', 'leek']),\n",
" ('keels', ['skeel', 'sleek']),\n",
" ('keen', ['keen', 'knee']),\n",
" ('kids', ['disk', 'skid']),\n",
" ('kills', ['skill']),\n",
" ('kiln', ['kiln', 'link']),\n",
" ('kin', ['ink', 'kin']),\n",
" ('kins', ['inks', 'sink', 'skin']),\n",
" ('kiss', ['kiss']),\n",
" ('kisser', ['kisser', 'rekiss']),\n",
" ('kitchen', ['kitchen', 'thicken']),\n",
" ('knee', ['keen', 'knee']),\n",
" ('koas', ['asok', 'soak', 'soka']),\n",
" ('krises', ['kisser', 'rekiss']),\n",
" ('lacy', ['acyl', 'clay', 'lacy']),\n",
" ('lade', ['dale', 'deal', 'lade', 'lead']),\n",
" ('laered', ['dealer', 'leader', 'redeal', 'relade', 'relead']),\n",
" ('lager', ['argel', 'ergal', 'garle', 'glare', 'lager', 'large', 'regal']),\n",
" ('lags', ['slag']),\n",
" ('laid', ['dali', 'dial', 'laid']),\n",
" ('lair', ['aril', 'lair', 'lari', 'liar', 'lira', 'rail', 'rial']),\n",
" ('lake', ['kale', 'lake', 'leak']),\n",
" ('lamb', ['balm', 'lamb']),\n",
" ('lameness', ['lameness', 'maleness', 'maneless', 'nameless']),\n",
" ('lames', ['amsel', 'mesal', 'samel']),\n",
" ('lamp', ['lamp', 'palm']),\n",
" ('lap', ['alp', 'lap', 'pal']),\n",
" ('lapins', ['spinal']),\n",
" ('laps', ['salp', 'slap']),\n",
" ('lapse', ['lapse', 'salep', 'saple', 'sepal', 'slape', 'spale', 'speal']),\n",
" ('large', ['argel', 'ergal', 'garle', 'glare', 'lager', 'large', 'regal']),\n",
" ('lari', ['aril', 'lair', 'lari', 'liar', 'lira', 'rail', 'rial']),\n",
" ('lases', ['salse']),\n",
" ('lashes', ['hassel', 'hassle']),\n",
" ('last', ['last', 'salt', 'slat']),\n",
" ('lasted', ['desalt', 'salted']),\n",
" ('lasting', ['lasting', 'salting', 'slating', 'staling']),\n",
" ('late', ['atle', 'laet', 'late', 'leat', 'tael', 'tale', 'teal']),\n",
" ('lats', ['last', 'salt', 'slat']),\n",
" ('layer', ['early', 'layer', 'relay']),\n",
" ('layered', ['delayer', 'layered', 'redelay']),\n",
" ('layers', ['reslay', 'slayer']),\n",
" ('laymen', ['meanly', 'namely']),\n",
" ('layover', ['layover', 'overlay']),\n",
" ('lays', ['slay']),\n",
" ('lead', ['dale', 'deal', 'lade', 'lead']),\n",
" ('leader', ['dealer', 'leader', 'redeal', 'relade', 'relead']),\n",
" ('leak', ['kale', 'lake', 'leak']),\n",
" ('leams', ['amsel', 'mesal', 'samel']),\n",
" ('leap', ['leap', 'lepa', 'pale', 'peal', 'plea']),\n",
" ('leaps', ['lapse', 'salep', 'saple', 'sepal', 'slape', 'spale', 'speal']),\n",
" ('leared', ['dealer', 'leader', 'redeal', 'relade', 'relead']),\n",
" ('learnt', ['altern', 'antler', 'learnt', 'rental', 'ternal']),\n",
" ('leary', ['early', 'layer', 'relay']),\n",
" ('leat', ['atle', 'laet', 'late', 'leat', 'tael', 'tale', 'teal']),\n",
" ('lee', ['eel', 'lee']),\n",
" ('leek', ['keel', 'kele', 'leek']),\n",
" ('leeks', ['skeel', 'sleek']),\n",
" ('left', ['felt', 'flet', 'left']),\n",
" ('leg', ['gel', 'leg']),\n",
" ('leke', ['keel', 'kele', 'leek']),\n",
" ('lemon', ['lemon', 'melon', 'monel']),\n",
" ('leper', ['leper', 'perle', 'repel']),\n",
" ('lessened', ['needless', 'seldseen']),\n",
" ('lessons', ['sonless']),\n",
" ('levis', ['slive']),\n",
" ('liar', ['aril', 'lair', 'lari', 'liar', 'lira', 'rail', 'rial']),\n",
" ('license', ['license', 'selenic', 'silence']),\n",
" ('licensed', ['licensed', 'silenced']),\n",
" ('licks', ['slick']),\n",
" ('lied', ['idle', 'lied']),\n",
" ('lifer', ['filer', 'flier', 'lifer', 'rifle']),\n",
" ('lime', ['lime', 'mile']),\n",
" ('limes', ['limes', 'slime', 'smile']),\n",
" ('limped', ['dimple']),\n",
" ('link', ['kiln', 'link']),\n",
" ('lino', ['lino', 'lion', 'loin', 'noil']),\n",
" ('lintseed', ['enlisted', 'lintseed']),\n",
" ('lion', ['lino', 'lion', 'loin', 'noil']),\n",
" ('lippers', ['slipper']),\n",
" ('lips', ['lisp', 'slip']),\n",
" ('lira', ['aril', 'lair', 'lari', 'liar', 'lira', 'rail', 'rial']),\n",
" ('lisp', ['lisp', 'slip']),\n",
" ('list', ['list', 'silt', 'slit']),\n",
" ('listen', ['enlist', 'listen', 'silent', 'tinsel']),\n",
" ('listened', ['enlisted', 'lintseed']),\n",
" ('listing', ['listing', 'silting']),\n",
" ('lits', ['list', 'silt', 'slit']),\n",
" ('live', ['evil', 'live', 'veil', 'vile', 'vlei']),\n",
" ('lives', ['slive']),\n",
" ('loca', ['alco', 'coal', 'cola', 'loca']),\n",
" ('loco', ['cool', 'loco']),\n",
" ('loin', ['lino', 'lion', 'loin', 'noil']),\n",
" ('lookout', ['lookout', 'outlook']),\n",
" ('looped', ['poodle']),\n",
" ('loops', ['polos', 'sloop', 'spool']),\n",
" ('loot', ['loot', 'tool']),\n",
" ('lose', ['lose', 'sloe', 'sole']),\n",
" ('lost', ['lost', 'lots', 'slot']),\n",
" ('loto', ['loot', 'tool']),\n",
" ('lots', ['lost', 'lots', 'slot']),\n",
" ('loyal', ['alloy', 'loyal']),\n",
" ('lump', ['lump', 'plum']),\n",
" ('lure', ['lure', 'rule']),\n",
" ('lured', ['duler', 'urled']),\n",
" ('lures', ['sluer']),\n",
" ('luring', ['ruling', 'urling']),\n",
" ('ma', ['am', 'ma']),\n",
" ('mace', ['acme', 'came', 'mace']),\n",
" ('mad', ['dam', 'mad']),\n",
" ('mainer', ['marine', 'remain']),\n",
" ('maleness', ['lameness', 'maleness', 'maneless', 'nameless']),\n",
" ('males', ['amsel', 'mesal', 'samel']),\n",
" ('mane', ['amen', 'enam', 'mane', 'mean', 'name', 'nema']),\n",
" ('maneless', ['lameness', 'maleness', 'maneless', 'nameless']),\n",
" ('manors', ['ramson', 'ransom']),\n",
" ('manures', ['surname']),\n",
" ('map', ['amp', 'map', 'pam']),\n",
" ('maples', ['sample']),\n",
" ('maps', ['samp', 'spam']),\n",
" ('mar', ['arm', 'mar', 'ram']),\n",
" ('march', ['charm', 'march']),\n",
" ('marcher', ['charmer', 'marcher', 'remarch']),\n",
" ('marching', ['charming']),\n",
" ('mare', ['mare', 'rame', 'ream']),\n",
" ('marine', ['marine', 'remain']),\n",
" ('marital', ['marital', 'martial']),\n",
" ('marons', ['ramson', 'ransom']),\n",
" ('mars', ['arms']),\n",
" ('martial', ['marital', 'martial']),\n",
" ('marts', ['smart', 'stram']),\n",
" ('mash', ['mash', 'samh', 'sham']),\n",
" ('mast', ['mast', 'stam']),\n",
" ('mate', ['mate', 'meat', 'meta', 'tame', 'team']),\n",
" ('mated', ['metad']),\n",
" ('mates', ['steam', 'stema']),\n",
" ('mating', ['mating']),\n",
" ('mats', ['mast', 'stam']),\n",
" ('meals', ['amsel', 'mesal', 'samel']),\n",
" ('mean', ['amen', 'enam', 'mane', 'mean', 'name', 'nema']),\n",
" ('meanly', ['meanly', 'namely']),\n",
" ('meat', ['mate', 'meat', 'meta', 'tame', 'team']),\n",
" ('meats', ['steam', 'stema']),\n",
" ('melas', ['amsel', 'mesal', 'samel']),\n",
" ('melon', ['lemon', 'melon', 'monel']),\n",
" ('melts', ['smelt']),\n",
" ('mesal', ['amsel', 'mesal', 'samel']),\n",
" ('meta', ['mate', 'meat', 'meta', 'tame', 'team']),\n",
" ('meteor', ['meteor', 'remote']),\n",
" ('metis', ['metis', 'smite', 'stime', 'times']),\n",
" ('metols', ['molest']),\n",
" ('mile', ['lime', 'mile']),\n",
" ('miles', ['limes', 'slime', 'smile']),\n",
" ('misprint', ['misprint']),\n",
" ('mite', ['emit', 'item', 'mite', 'time']),\n",
" ('mites', ['metis', 'smite', 'stime', 'times']),\n",
" ('mobbed', ['bombed']),\n",
" ('moist', ['moist']),\n",
" ('moits', ['moist']),\n",
" ('molest', ['molest']),\n",
" ('mono', ['mono', 'moon']),\n",
" ('mood', ['doom', 'mood']),\n",
" ('moon', ['mono', 'moon']),\n",
" ('moor', ['moor', 'moro', 'room']),\n",
" ('motels', ['molest']),\n",
" ('much', ['chum', 'much']),\n",
" ('mug', ['gum', 'mug']),\n",
" ('murenas', ['surname']),\n",
" ('mush', ['mush']),\n",
" ('mutilate', ['mutilate', 'ultimate']),\n",
" ('nags', ['sang', 'snag']),\n",
" ('nails', ['sinal', 'slain', 'snail']),\n",
" ('name', ['amen', 'enam', 'mane', 'mean', 'name', 'nema']),\n",
" ('nameless', ['lameness', 'maleness', 'maneless', 'nameless']),\n",
" ('namely', ['meanly', 'namely']),\n",
" ('nap', ['nap', 'pan']),\n",
" ('nare', ['earn', 'near', 'rane']),\n",
" ('nat', ['ant', 'nat', 'tan']),\n",
" ('nay', ['any', 'nay', 'yan']),\n",
" ('near', ['earn', 'near', 'rane']),\n",
" ('nearer', ['earner']),\n",
" ('needless', ['needless', 'seldseen']),\n",
" ('needs', ['dense', 'needs']),\n",
" ('nema', ['amen', 'enam', 'mane', 'mean', 'name', 'nema']),\n",
" ('neon', ['neon', 'none']),\n",
" ('nest', ['nest', 'sent', 'sten']),\n",
" ('net', ['net', 'ten']),\n",
" ('nets', ['nest', 'sent', 'sten']),\n",
" ('nevi', ['vein', 'vine']),\n",
" ('nicest', ['encist', 'incest', 'insect', 'scient']),\n",
" ('night', ['night', 'thing']),\n",
" ('nights', ['nights']),\n",
" ('nip', ['nip', 'pin']),\n",
" ('nips', ['snip', 'spin']),\n",
" ('nis', ['sin']),\n",
" ('no', ['no', 'on']),\n",
" ('nod', ['don', 'nod']),\n",
" ('node', ['done', 'node']),\n",
" ('noil', ['lino', 'lion', 'loin', 'noil']),\n",
" ('none', ['neon', 'none']),\n",
" ('normas', ['ramson', 'ransom']),\n",
" ('not', ['not', 'ton']),\n",
" ('note', ['note', 'tone']),\n",
" ('noted', ['noted', 'toned']),\n",
" ('noteless', ['noteless', 'toneless']),\n",
" ('notices', ['contise', 'noetics', 'section']),\n",
" ('noughts', ['gunshot', 'shotgun', 'uhtsong']),\n",
" ('now', ['now', 'own', 'won']),\n",
" ('nows', ['snow', 'sown']),\n",
" ('nude', ['dune', 'nude', 'unde']),\n",
" ('nudity', ['nudity', 'untidy']),\n",
" ('nur', ['run', 'urn']),\n",
" ('nurs', ['snur']),\n",
" ('oaks', ['asok', 'soak', 'soka']),\n",
" ('ocean', ['acone', 'canoe', 'ocean']),\n",
" ('oceanic', ['cocaine', 'oceanic']),\n",
" ('oh', ['ho', 'oh']),\n",
" ('oils', ['silo', 'siol', 'soil', 'soli']),\n",
" ('okas', ['asok', 'soak', 'soka']),\n",
" ('oles', ['lose', 'sloe', 'sole']),\n",
" ('omits', ['moist']),\n",
" ('on', ['no', 'on']),\n",
" ('once', ['cone', 'once']),\n",
" ('opener', ['opener', 'reopen', 'repone']),\n",
" ('opt', ['opt', 'pot', 'top']),\n",
" ('option', ['option', 'potion']),\n",
" ('opts', ['post', 'spot', 'stop', 'tops']),\n",
" ('orbed', ['boder', 'orbed']),\n",
" ('ores', ['eros', 'rose', 'sero', 'sore']),\n",
" ('organist', ['orangist', 'organist', 'roasting', 'signator']),\n",
" ('oriental', ['oriental', 'relation']),\n",
" ('ought', ['ought', 'tough']),\n",
" ('oughts', ['sought']),\n",
" ('ours', ['ours', 'sour']),\n",
" ('outlook', ['lookout', 'outlook']),\n",
" ('overhang', ['overhang']),\n",
" ('overlay', ['layover', 'overlay']),\n",
" ('own', ['now', 'own', 'won']),\n",
" ('owns', ['snow', 'sown']),\n",
" ('owt', ['tow', 'two', 'wot']),\n",
" ('pace', ['cape', 'cepa', 'pace']),\n",
" ('packer', ['packer', 'repack']),\n",
" ('padle', ['padle', 'paled', 'pedal', 'plead']),\n",
" ('painter', ['painter', 'pertain', 'repaint']),\n",
" ('paired', ['diaper', 'paired']),\n",
" ('pal', ['alp', 'lap', 'pal']),\n",
" ('pale', ['leap', 'lepa', 'pale', 'peal', 'plea']),\n",
" ('paled', ['padle', 'paled', 'pedal', 'plead']),\n",
" ('pales', ['lapse', 'salep', 'saple', 'sepal', 'slape', 'spale', 'speal']),\n",
" ('palest', ['pastel', 'septal', 'staple']),\n",
" ('palets', ['pastel', 'septal', 'staple']),\n",
" ('palm', ['lamp', 'palm']),\n",
" ('pals', ['salp', 'slap']),\n",
" ('pam', ['amp', 'map', 'pam']),\n",
" ('pams', ['samp', 'spam']),\n",
" ('pan', ['nap', 'pan']),\n",
" ('panel', ['panel', 'penal', 'plane']),\n",
" ('pardie', ['diaper', 'paired']),\n",
" ('pare', ['aper', 'pare', 'pear', 'rape', 'reap']),\n",
" ('parks', ['spark']),\n",
" ('partim', ['armpit', 'impart']),\n",
" ('parts', ['spart', 'sprat', 'strap', 'traps']),\n",
" ('pass', ['pass']),\n",
" ('pastel', ['pastel', 'septal', 'staple']),\n",
" ('pat', ['apt', 'pat', 'tap']),\n",
" ('pate', ['pate', 'peat', 'tape', 'teap']),\n",
" ('pay', ['pay', 'pya', 'yap']),\n",
" ('pea', ['ape', 'pea']),\n",
" ('peaks', ['sapek', 'speak']),\n",
" ('peal', ['leap', 'lepa', 'pale', 'peal', 'plea']),\n",
" ('peals', ['lapse', 'salep', 'saple', 'sepal', 'slape', 'spale', 'speal']),\n",
" ('pear', ['aper', 'pare', 'pear', 'rape', 'reap']),\n",
" ('peat', ['pate', 'peat', 'tape', 'teap']),\n",
" ('pedal', ['padle', 'paled', 'pedal', 'plead']),\n",
" ('pela', ['leap', 'lepa', 'pale', 'peal', 'plea']),\n",
" ('pelas', ['lapse', 'salep', 'saple', 'sepal', 'slape', 'spale', 'speal']),\n",
" ('pelmas', ['sample']),\n",
" ('peltas', ['pastel', 'septal', 'staple']),\n",
" ('pelts', ['slept', 'spelt', 'splet']),\n",
" ('penal', ['panel', 'penal', 'plane']),\n",
" ('penster', ['penster', 'present', 'serpent', 'strepen']),\n",
" ('per', ['per', 'rep']),\n",
" ('pereon', ['opener', 'reopen', 'repone']),\n",
" ('peri', ['peri', 'pier', 'ripe']),\n",
" ('perone', ['opener', 'reopen', 'repone']),\n",
" ('pertain', ['painter', 'pertain', 'repaint']),\n",
" ('pest', ['pest', 'sept', 'spet', 'step']),\n",
" ('petals', ['pastel', 'septal', 'staple']),\n",
" ('pets', ['pest', 'sept', 'spet', 'step']),\n",
" ('pier', ['peri', 'pier', 'ripe']),\n",
" ('pills', ['spill']),\n",
" ('pin', ['nip', 'pin']),\n",
" ('pinots', ['piston']),\n",
" ('pins', ['snip', 'spin']),\n",
" ('pintos', ['piston']),\n",
" ('piston', ['piston']),\n",
" ('pit', ['pit', 'tip']),\n",
" ('pitons', ['piston']),\n",
" ('pits', ['pist', 'spit']),\n",
" ('plains', ['spinal']),\n",
" ('plane', ['panel', 'penal', 'plane']),\n",
" ('plaste', ['pastel', 'septal', 'staple']),\n",
" ('plates', ['pastel', 'septal', 'staple']),\n",
" ('plea', ['leap', 'lepa', 'pale', 'peal', 'plea']),\n",
" ('plead', ['padle', 'paled', 'pedal', 'plead']),\n",
" ('pleas', ['lapse', 'salep', 'saple', 'sepal', 'slape', 'spale', 'speal']),\n",
" ('pleats', ['pastel', 'septal', 'staple']),\n",
" ('plena', ['panel', 'penal', 'plane']),\n",
" ('plug', ['gulp', 'plug']),\n",
" ('plum', ['lump', 'plum']),\n",
" ('points', ['piston']),\n",
" ('polos', ['polos', 'sloop', 'spool']),\n",
" ('poodle', ['poodle']),\n",
" ('pooled', ['poodle']),\n",
" ('pools', ['polos', 'sloop', 'spool']),\n",
" ('pore', ['pore', 'rope']),\n",
" ('pores', ['poser', 'prose', 'ropes', 'spore']),\n",
" ('ports', ['sport', 'strop']),\n",
" ('poser', ['poser', 'prose', 'ropes', 'spore']),\n",
" ('post', ['post', 'spot', 'stop', 'tops']),\n",
" ('postin', ['piston']),\n",
" ('postman', ['postman', 'topsman']),\n",
" ('pot', ['opt', 'pot', 'top']),\n",
" ('potins', ['piston']),\n",
" ('potion', ['option', 'potion']),\n",
" ('pots', ['post', 'spot', 'stop', 'tops']),\n",
" ('praised', ['despair', 'pardesi']),\n",
" ('prats', ['spart', 'sprat', 'strap', 'traps']),\n",
" ('prays', ['raspy', 'spary', 'spray']),\n",
" ('pre', ['per', 'rep']),\n",
" ('present', ['penster', 'present', 'serpent', 'strepen']),\n",
" ('printer', ['printer', 'reprint']),\n",
" ('pronto', ['pronto', 'proton']),\n",
" ('prose', ['poser', 'prose', 'ropes', 'spore']),\n",
" ('prost', ['sport', 'strop']),\n",
" ('proton', ['pronto', 'proton']),\n",
" ('pya', ['pay', 'pya', 'yap']),\n",
" ('quiet', ['quiet', 'quite']),\n",
" ('quite', ['quiet', 'quite']),\n",
" ('race', ['acre', 'care', 'crea', 'race']),\n",
" ('races', ['carse', 'caser', 'ceras', 'scare', 'scrae']),\n",
" ('racket', ['racket', 'retack', 'tacker']),\n",
" ('rade', ['ared', 'daer', 'dare', 'dear', 'read']),\n",
" ('ragee', ['agree', 'eager', 'eagre']),\n",
" ('ragees', ['grease']),\n",
" ('raginis', ['raising']),\n",
" ('rail', ['aril', 'lair', 'lari', 'liar', 'lira', 'rail', 'rial']),\n",
" ('raising', ['raising']),\n",
" ('ram', ['arm', 'mar', 'ram']),\n",
" ('rams', ['arms']),\n",
" ('ramson', ['ramson', 'ransom']),\n",
" ('ransom', ['ramson', 'ransom']),\n",
" ('rape', ['aper', 'pare', 'pear', 'rape', 'reap']),\n",
" ('rare', ['rare', 'rear']),\n",
" ('rase', ['arse', 'rase', 'sare', 'sear', 'sera']),\n",
" ('raspy', ['raspy', 'spary', 'spray']),\n",
" ('rast', ['sart', 'star', 'stra', 'tars', 'tsar']),\n",
" ('rat', ['art', 'rat', 'tar', 'tra']),\n",
" ('rats', ['sart', 'star', 'stra', 'tars', 'tsar']),\n",
" ('raw', ['raw', 'war']),\n",
" ('rayle', ['early', 'layer', 'relay']),\n",
" ('rayles', ['reslay', 'slayer']),\n",
" ('react',\n",
" ['caret',\n",
" 'carte',\n",
" 'cater',\n",
" 'crate',\n",
" 'creat',\n",
" 'creta',\n",
" 'react',\n",
" 'recta',\n",
" 'trace']),\n",
" ('read', ['ared', 'daer', 'dare', 'dear', 'read']),\n",
" ('reader', ['reader', 'redare', 'reread']),\n",
" ('realist', ['realist', 'saltier']),\n",
" ('ream', ['mare', 'rame', 'ream']),\n",
" ('rean', ['earn', 'near', 'rane']),\n",
" ('reap', ['aper', 'pare', 'pear', 'rape', 'reap']),\n",
" ('rear', ['rare', 'rear']),\n",
" ('reared', ['reader', 'redare', 'reread']),\n",
" ('rebuild', ['builder', 'rebuild']),\n",
" ('recall', ['caller', 'cellar', 'recall']),\n",
" ('recede', ['decree', 'recede']),\n",
" ('recital', ['article', 'recital']),\n",
" ('recitals', ['altrices', 'selictar']),\n",
" ('recta',\n",
" ['caret',\n",
" 'carte',\n",
" 'cater',\n",
" 'crate',\n",
" 'creat',\n",
" 'creta',\n",
" 'react',\n",
" 'recta',\n",
" 'trace']),\n",
" ('rectos', ['corset', 'coster', 'escort', 'scoter', 'sector']),\n",
" ('recuse', ['ceruse', 'recuse', 'rescue', 'secure']),\n",
" ('recused', ['seducer']),\n",
" ('redeal', ['dealer', 'leader', 'redeal', 'relade', 'relead']),\n",
" ('redear', ['reader', 'redare', 'reread']),\n",
" ('redfin', ['finder', 'friend', 'redfin', 'refind']),\n",
" ('reduces', ['seducer']),\n",
" ('reearn', ['earner']),\n",
" ('reef', ['feer', 'free', 'reef']),\n",
" ('reest',\n",
" ['ester',\n",
" 'estre',\n",
" 'reest',\n",
" 'reset',\n",
" 'steer',\n",
" 'stere',\n",
" 'stree',\n",
" 'terse',\n",
" 'tsere']),\n",
" ('refed', ['defer', 'freed']),\n",
" ('refill', ['filler', 'refill']),\n",
" ('refind', ['finder', 'friend', 'redfin', 'refind']),\n",
" ('refining', ['infringe', 'refining']),\n",
" ('reform', ['former', 'reform']),\n",
" ('regal', ['argel', 'ergal', 'garle', 'glare', 'lager', 'large', 'regal']),\n",
" ('reheat', ['heater', 'hereat', 'reheat']),\n",
" ('reheats', ['thereas']),\n",
" ('reifs', ['serif']),\n",
" ('reins', ['reins', 'resin', 'rinse', 'risen', 'serin', 'siren']),\n",
" ('reird', ['drier', 'rider']),\n",
" ('reists', ['resist', 'restis', 'sister']),\n",
" ('rejoin', ['joiner', 'rejoin']),\n",
" ('relation', ['oriental', 'relation']),\n",
" ('relay', ['early', 'layer', 'relay']),\n",
" ('relayed', ['delayer', 'layered', 'redelay']),\n",
" ('relays', ['reslay', 'slayer']),\n",
" ('remain', ['marine', 'remain']),\n",
" ('remote', ['meteor', 'remote']),\n",
" ('rental', ['altern', 'antler', 'learnt', 'rental', 'ternal']),\n",
" ('rentals', ['saltern', 'starnel', 'sternal']),\n",
" ('reopen', ['opener', 'reopen', 'repone']),\n",
" ('rep', ['per', 'rep']),\n",
" ('repack', ['packer', 'repack']),\n",
" ('repaid', ['diaper', 'paired']),\n",
" ('repaint', ['painter', 'pertain', 'repaint']),\n",
" ('repel', ['leper', 'perle', 'repel']),\n",
" ('repents', ['penster', 'present', 'serpent', 'strepen']),\n",
" ('repins', ['respin', 'sniper']),\n",
" ('repo', ['pore', 'rope']),\n",
" ('repone', ['opener', 'reopen', 'repone']),\n",
" ('repos', ['poser', 'prose', 'ropes', 'spore']),\n",
" ('reprint', ['printer', 'reprint']),\n",
" ('reread', ['reader', 'redare', 'reread']),\n",
" ('rescue', ['ceruse', 'recuse', 'rescue', 'secure']),\n",
" ('rescued', ['seducer']),\n",
" ('resell', ['resell', 'seller']),\n",
" ('resend', ['resend', 'sender']),\n",
" ('reserve', ['reserve', 'resever', 'reverse', 'severer']),\n",
" ('reserved', ['deserver', 'reserved', 'reversed']),\n",
" ('reset',\n",
" ['ester',\n",
" 'estre',\n",
" 'reest',\n",
" 'reset',\n",
" 'steer',\n",
" 'stere',\n",
" 'stree',\n",
" 'terse',\n",
" 'tsere']),\n",
" ('reshow', ['shower']),\n",
" ('resin', ['reins', 'resin', 'rinse', 'risen', 'serin', 'siren']),\n",
" ('resist', ['resist', 'restis', 'sister']),\n",
" ('resits', ['resist', 'restis', 'sister']),\n",
" ('retack', ['racket', 'retack', 'tacker']),\n",
" ('retag', ['gater', 'grate', 'great', 'retag', 'targe']),\n",
" ('retails', ['realist', 'saltier']),\n",
" ('retes',\n",
" ['ester',\n",
" 'estre',\n",
" 'reest',\n",
" 'reset',\n",
" 'steer',\n",
" 'stere',\n",
" 'stree',\n",
" 'terse',\n",
" 'tsere']),\n",
" ('rethink', ['rethink', 'thinker']),\n",
" ('retrain', ['arterin', 'retrain', 'terrain', 'trainer']),\n",
" ('retund', ['runted', 'tunder', 'turned']),\n",
" ('reveres', ['reserve', 'resever', 'reverse', 'severer']),\n",
" ('reverse', ['reserve', 'resever', 'reverse', 'severer']),\n",
" ('reversed', ['deserver', 'reserved', 'reversed']),\n",
" ('review', ['review', 'viewer']),\n",
" ('rhies', ['hirse', 'shier', 'shire']),\n",
" ('rial', ['aril', 'lair', 'lari', 'liar', 'lira', 'rail', 'rial']),\n",
" ('rictus', ['citrus', 'rictus', 'rustic']),\n",
" ('rider', ['drier', 'rider']),\n",
" ('rifle', ['filer', 'flier', 'lifer', 'rifle']),\n",
" ('rines', ['reins', 'resin', 'rinse', 'risen', 'serin', 'siren']),\n",
" ('ring', ['girn', 'grin', 'ring']),\n",
" ('rinse', ['reins', 'resin', 'rinse', 'risen', 'serin', 'siren']),\n",
" ('ripe', ['peri', 'pier', 'ripe']),\n",
" ('ripens', ['respin', 'sniper']),\n",
" ('ripples', ['slipper']),\n",
" ('risen', ['reins', 'resin', 'rinse', 'risen', 'serin', 'siren']),\n",
" ('rite', ['iter', 'reit', 'rite', 'tier', 'tire']),\n",
" ('rival', ['rival', 'viral']),\n",
" ('roasting', ['orangist', 'organist', 'roasting', 'signator']),\n",
" ('robed', ['boder', 'orbed']),\n",
" ('robes', ['boser', 'brose', 'sober']),\n",
" ('rock', ['cork', 'rock']),\n",
" ('roes', ['eros', 'rose', 'sero', 'sore']),\n",
" ('romans', ['ramson', 'ransom']),\n",
" ('room', ['moor', 'moro', 'room']),\n",
" ('rope', ['pore', 'rope']),\n",
" ('ropes', ['poser', 'prose', 'ropes', 'spore']),\n",
" ('rose', ['eros', 'rose', 'sero', 'sore']),\n",
" ('rout', ['rout', 'toru', 'tour']),\n",
" ('rowdier', ['worried']),\n",
" ('ruby', ['bury', 'ruby']),\n",
" ('rule', ['lure', 'rule']),\n",
" ('ruled', ['duler', 'urled']),\n",
" ('rules', ['sluer']),\n",
" ('ruling', ['ruling', 'urling']),\n",
" ('run', ['run', 'urn']),\n",
" ('runs', ['snur']),\n",
" ('runted', ['runted', 'tunder', 'turned']),\n",
" ('runts', ['snurt', 'turns']),\n",
" ('rust', ['rust']),\n",
" ('rustic', ['citrus', 'rictus', 'rustic']),\n",
" ('rusts', ['truss']),\n",
" ('ruts', ['rust']),\n",
" ('sack', ['cask', 'sack']),\n",
" ('sacred', ['sacred']),\n",
" ('sag', ['gas', 'sag']),\n",
" ('saint', ['saint', 'satin', 'stain']),\n",
" ('sairing', ['raising']),\n",
" ('salep', ['lapse', 'salep', 'saple', 'sepal', 'slape', 'spale', 'speal']),\n",
" ('sales', ['salse']),\n",
" ('salesmen', ['lameness', 'maleness', 'maneless', 'nameless']),\n",
" ('salp', ['salp', 'slap']),\n",
" ('salse', ['salse']),\n",
" ('salt', ['last', 'salt', 'slat']),\n",
" ('salted', ['desalt', 'salted']),\n",
" ('saltern', ['saltern', 'starnel', 'sternal']),\n",
" ('saltier', ['realist', 'saltier']),\n",
" ('salting', ['lasting', 'salting', 'slating', 'staling']),\n",
" ('saltire', ['realist', 'saltier']),\n",
" ('samel', ['amsel', 'mesal', 'samel']),\n",
" ('samp', ['samp', 'spam']),\n",
" ('sample', ['sample']),\n",
" ('sang', ['sang', 'snag']),\n",
" ('santir', ['instar', 'santir', 'strain']),\n",
" ('saps', ['pass']),\n",
" ('sate', ['ates', 'east', 'eats', 'sate', 'seat', 'seta']),\n",
" ('satem', ['steam', 'stema']),\n",
" ('satin', ['saint', 'satin', 'stain']),\n",
" ('sauce', ['cause', 'sauce']),\n",
" ('sauces', ['causse']),\n",
" ('save', ['save', 'vase']),\n",
" ('saw', ['saw', 'swa', 'was']),\n",
" ('sawed', ['sawed']),\n",
" ('scab', ['scab']),\n",
" ('scan', ['scan']),\n",
" ('scar', ['scar']),\n",
" ('scare', ['carse', 'caser', 'ceras', 'scare', 'scrae']),\n",
" ('scared', ['sacred']),\n",
" ('scat', ['cast', 'scat']),\n",
" ('scent', ['scent']),\n",
" ...]"
]
},
"execution_count": 21,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"words_anagrams"
]
},
{
"cell_type": "markdown",
"id": "d91434bc",
"metadata": {},
"source": [
"The complexity of this algorithm is O(M * KlogK + N), much much faster!"
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "03ce3e28",
"metadata": {},
"outputs": [],
"source": []
},
{
"cell_type": "code",
"execution_count": null,
"id": "a2fc5ec4",
"metadata": {},
"outputs": [],
"source": []
}
],
"metadata": {
"kernelspec": {
"display_name": "Python 3 (ipykernel)",
"language": "python",
"name": "python3"
},
"language_info": {
"codemirror_mode": {
"name": "ipython",
"version": 3
},
"file_extension": ".py",
"mimetype": "text/x-python",
"name": "python",
"nbconvert_exporter": "python",
"pygments_lexer": "ipython3",
"version": "3.11.3"
}
},
"nbformat": 4,
"nbformat_minor": 5
}