defcandidates(word): return (known([word]) or known(edits1(word)) or known(edits2(word)) or [word])
defknown(words): returnset(w for w in words if w in WORDS)
defedits1(word): letters = 'abcdefghijklmnopqrstuvwxyz' splits = [(word[:i], word[i:]) for i inrange(len(word) + 1)] deletes = [L + R[1:] for L, R in splits if R] transposes = [L + R[1] + R[0] + R[2:] for L, R in splits iflen(R)>1] replaces = [L + c + R[1:] for L, R in splits if R for c in letters] inserts = [L + c + R for L, R in splits for c in letters] returnset(deletes + transposes + replaces + inserts)
defedits2(word): return (e2 for e1 in edits1(word) for e2 in edits1(e1))
defedits1(word): letters = 'abcdefghijklmnopqrstuvwxyz' splits = [(word[:i], word[i:]) for i inrange(len(word) + 1)] deletes = [L + R[1:] for L, R in splits if R] transposes = [L + R[1] + R[0] + R[2:] for L, R in splits iflen(R)>1] replaces = [L + c + R[1:] for L, R in splits if R for c in letters] inserts = [L + c + R for L, R in splits for c in letters] returnset(deletes + transposes + replaces + inserts)