Jacob Lee wrote:
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')

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.,

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

Reply via email to