string.translate is a good idea. Note you can handle upper-casing and translation in one operation by adding a mapping from lower case to the complement i.e.,There are a bunch of new tests up at shootout.alioth.debian.org for which Python does not yet have code. I've taken a crack at one of them, a task to print the reverse complement of a gene transcription. Since there are a lot of minds on this newsgroup that are much better at optimization than I, I'm posting the code I came up with to see if anyone sees any opportunities for substantial improvement. Without further ado:
table = string.maketrans('ACBDGHK\nMNSRUTWVY', 'TGVHCDM\nKNSYAAWBR')
table = string.maketrans('ACBDGHK\nMNSRUTWVYacbdghkmnsrutwvy', 'TGVHCDM\nKNSYAAWBRTGVHCDMKNSYAAWBR')
def show(s): i = 0 for char in s.upper().translate(table)[::-1]:
if i == 60: print i = 0 sys.stdout.write(char) i += 1 print
def main(): seq = '' for line in sys.stdin: if line[0] == '>' or line[0] == ';': if seq != '': show(seq) seq = '' print line, else: seq += line[:-1] show(seq)
main()
This looks unwieldy - especially writing to sys.stdout oe character at a time. I may not have understood the spec exactly, but isn't this the same as:
for line in sys.stdin: if line and (line[0] == ">" or line[0] == ";"): print line else: print line.translate(table)
HTH
Michael
-- http://mail.python.org/mailman/listinfo/python-list