This week's puzzle wasn't a breeze to completely solve computationally, but we can certainly make it trivial to find the answer by hand:

Name something in eight letters that's usually bought in pairs. Change the second letter to the letter two spaces later in the alphabet, and you'll get a new word that names something else that's usually bought in pairs. Both words are plurals. What are they?

The trick here is that it's not too simple to tell Python how to figure out if something is sold in pairs. So what we really need to do here is bring the sample size of eligible words down to something we can look at manually. The following code narrows it down to just nine possibilities, two of which are actually valid answers.

Note that it does make a big difference the way you order the criteria for your list comprehension. You should work to make sure that the most "computationally-effective" filters are done first. Here, we're narrowing the list of all words down to those of length 8 first; this is a cheap operation and eliminates a large proportion of the total dictionary. With those eliminated, we no longer need to perform any additional operations on longer or shorter words.

Also note that here again, we're using the O(1)-speed set type to store our words; this lets us check whether a string is a word very quickly, with no iteration required.

from __future__ import print_function

import string

    from urllib2 import urlopen
except ImportError:
    from urllib.request import urlopen

LETTERS = string.ascii_lowercase
MAP = {each: LETTERS[i-24] for i, each in enumerate(LETTERS)}

def mangle(word):
    word = list(word)
    word[1] = MAP.get(word[1], '_')
    return ''.join(word)

def main():
    words = set(urlopen(DICTIONARY_URL).read().decode('utf-8').splitlines())
    potentials = [x for x in words if len(x) == 8 and mangle(x) in words and x[-1] == 's']
    for word in sorted(potentials):
        print('{} - {}'.format(word, mangle(word)))

if __name__ == '__main__':