word shifts

Arnaud Delobelle arnodel at googlemail.com
Sun May 4 03:10:40 EDT 2008


dave <squareswallower at invalid.com> writes:

> Hello,
>
> I made a function that takes a word list (one word per line, text
> file) and searches for all the words in the list that are 'shifts' of
> eachother.  'abc' shifted 1 is 'bcd'
>
> Please take a look and tell me if this is a viable solution.
>
> def shift(word, amt):
> 	ans = ''
> 	for letter in word:
> 		ans = ans + chr((ord(letter) - ord('a') + amt) % 26 + ord('a'))
> 	return ans

In Python, if you want to build a string from lots of parts you can
use ''.join(parts).  I think it is considered more efficient.


>
> def fileshift(x):
> 	fin = open(x)
> 	d = {}
> 	for line in fin:
> 		d[line.strip()] = [1]
> 		for i in range(1, 26):
> 			ite = shift(line.strip(), i)
> 			if ite in d:
> 				print ite
>


You could write:

       line = line.strip()

after your for line in fin: statement, rather than strip the line twice.

Let me suggest a different solution base on the str.translate() method

from string import lowercase, maketrans

shifted_lowercase = lowercase[1:] +lowercase[0]
table = string.maketrans(lowercase, shifted_lowercase)

def shift1(line):
    return line.translate(table)

def fileshift(path):
    lines = set()
    for line in open(path):
        lines.add(line)
        for i in xrange(25):
            line = shift1(line)
            if line in lines:
                print line

(untested)

-- 
Arnaud



More information about the Python-list mailing list