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