[Python Patterns] Working with DNA

Python and random DNA strings, oh my!

At some point I went through a mental exercise to think about working with DNA in Python.  I imagined what generating DNA strings would look like and then bringing two parents together to create a child.  Here is the output of that thought process.

Note: This is probably inaccurate in the real world, but a nifty thing to think about on a rainy Saturday.

import random

# Generates two parents and then mashes them together based on a random number
# this will print out a new DNA sequence 
# based on the two parent's random binary string
# Purely just for fun playing with random psuedo DNA sequences.


def get_dna():
    """ Generate a random DNS sequence """
    dna = ['A', 'G', 'C', 'T']
    random_sequence = ''
    for i in range(0, 81):
        random_sequence += random.choice(dna)
    # print(random_sequence)
    return random_sequence


def main():
    # Generate the parents
    parent1 = get_dna()
    print(f'DNA Sequence Parent 1: {parent1}')
    parent2 = get_dna()
    print(f'DNA Sequence Parent 2: {parent2}')

    # Choose random number up to 27 digits when converted to binary
    random_number = random.randint(0, 134217727)

    # Example: Hard set the random number for testing
    # random_number = 21123

    # Convert to binary 1's and 0's
    rand_binary = str(bin(random_number))[2:].zfill(27)
    # Setup our sequence 
    # DNA has 3 characters
    first_number = 0
    second_number = 3
    count = 0
    # Setup and  fill our parent lists
    p0 = [parent1[0:3]]
    p1 = [parent2[0:3]]

    while count <= 25:
        first_number += 3
        second_number += 3
        p0.append(parent1[first_number:second_number])
        p1.append(parent2[first_number:second_number])
        count += 1

    new_child_array = []
    # Setup the child based on the 1's and 0's of the random binary above
    for digit, index in enumerate(rand_binary):
        if int(index) > 0:
            new_child_array.append(p1[digit])
        else:
            new_child_array.append(p0[digit])
    # Make child
    new_child = ''.join(map(str, new_child_array))

    print('Parent 1 DNA Sequence broken out: {}'.format(p0))
    print('----')

    print('Parent 2 DNA Sequence broken out: {}'.format(p1))
    print('----')

    print('The new child DNA from these parents: {}'.format(new_child))
    # return the child
    return new_child


if __name__ == '__main__':
    main()

My blog posts tagged with "Python Patterns" are designed to be a quick look reference for some Python code snippets I use a lot.  They are written to be a quick starting point for future projects so I do not need to type as much.