1

So i Have a DNA fasta file. Its format is as follows: (Input Image)

Rosalind_8728 ATGGAGCCGCACATATAACGGTAAATGCAAAGAAACAGTTCGGGAAAGATATTCAACCAA GGCAACTTCCTGCACTCGTCGCGGGCACGTAGGGAGCCTGACCATCCCTACCCAGACTGT CCCCGATCAGCGAACGGGCCATGCGCTATCAGGTCGATCTAGCACTTGGTAAGTTACGCC AGCTGTACTGAAACAATGCCCGTAGTGACTGAGACGCCAGGGAAAAGGGGATTAAAGCTA TGGTAGCCAATCGTCCTAACCTCTAGCCCGCCTGGTATGTAAGAACAAGACATCAGAGAT ATAGAGGCAGACCGGACCTGCAAGCCGGTCACCTGTGGCTCCCGACAAATGTGGCGTTTA GCTTATGCAAGACCGAAGCTTAGAACCAAGTCGGCTTCGTACCCCTTCTTACCTGTCCAC TGCAGTGTTTTGCCTGGATCCGGGTGCGCGTGGCACGAGATCTGCTGAGAAGCTATGAAC AATCAAATGTGTAGCCCGCTTACGAAGAATCCAGCCCTGAATTCGGGGGCCAGTCTTCGC CGAACTCCCCCTATTGAGTGGTAAAGTGTGTGACTCCTAGTCTTTTCACCCGAGTCGTTG AATTGTTAGGCTACAGATTTCGCATAGCCCTGATCCAAGCCTTTCTCTGAAAAGATGCGA CCTGCATCACTAAGGCCAACCGTGTGTCTCTCCGACATTACGGCAGTGCCACTGATCGCT CACGAACTTGGGAAGCCCCAAAAACTCACATGAGTATGTAGGGCAGTTTTATAGGCTGGG CCCACCCACTTGGTTAGCAAATGGCGCCTGCTCAGAACTCCTTTTACGTAAGTGGTCCCA GTGTGATGGGTCGAGTGAACAAACAAATGTTGACAATTTGCCTCGGGGTTA

Rosalind_6085 CGGATCTGCGTACGGTTGCGTATCCCGTTCAAATGCTCCATCACTCATCACGGAGCCACG TTCCGACCTGCCCACATCTGCGTCTAATACCACGCCAGTACTTACCACGCCGCTGGGTCT TCGAGAACGAGGCTGAATGGGTTTCCGGGGGTGGGAAAGTAATACAAGCGTCATTCGTGA ACTGGGACCATGTCATCTGGCGAAGCTATAGTGCGATCGAACTAAACGCTAATACGTCGA AACAGTCTATGGCCGTGAACTTTCTCTAGAGGGTAGGGTTCTTAGCCCCGCCTATTACTT GAACGGATATCAAAGACAGACTTAGCATCTCTGTACCCGCCCTACTGTTGCTTCAAGTCA TGCGGAGATTTGTGGGAGCTTGGTCACCTATCGGGCACATCCAGAATGGTCTTTCTCGTA GGTTGAAACAGCCGGGATGCACGTGTGTTTTGTAGGCAAATATAGTGTTTCCGGTGCTAA CTAGATTGAGGCAACTCCTATGCCAGAGCATACGGATAGAGACCGAATTGTTTATATGTG CGTTTACCCGATCAGATGCAGTACTTTGGTGGGCAATTTTAGTGAATTGCTCACGTGTTT TAATAACCGGTCCAAGGTTACCTCCCGCCACGTCATAGAGAAATGGGGGAGTATAGAGAG GTAGCTTCTTTCCACACTTGCTTCGAAAAGTGGCCCTCCCTAGGCCACTCCAGATCACTT CCCTCGCAGCCGATACTTTAAATCTGTTCTCGACTGGTTTAACGTTTTGAGCGAGATTGT GCAGGTCTATCGTCGAGTTTTAGGAGAAACCGTGGCTGTCTCAAACCGGTAGCGACCAAG TAACTTGTGTGGTGTGGCGCGTACCCCTTTTCCTTTCCGACAACACTGTACCCCTAGATA TAGTGGAATCAGTGAATCAAGATCTACCGGGAATAGACACTCGCTTGAGAAAACATTTCC

Ultimately I want to see which of these Rosalind_ids has the DNA with the most G's and C's. So my thought process is making a list of the id tags, and then a list of all the dna associated with it. Then zipping them in a dictionary, and create a function to determine highest GC letter concentration. The problem is when I append the lines of multiple letters, I get a list with each line seperated by ',' instead of 1 list containing ALL lines below a rosalind_id_tag and then seperate them with a ',' if its a new tag.

So ultimately I want:

dna = [list of letters from first random_id, list of letters from second_random_id, ...] 

instead of what im getting which is:

dna = [this is first line, this is second line, this is third line,..] 

I have tried extend but that doesn't seem to work.

Ive tried making nested lists and appending them to my main DNA list also

My code so far (that works) is:

file = open("rosalind_gc.txt", "r")


data = file.readlines()

rosalindtags = []

dna = []


for a in data:

    if a.startswith(">"):

        rosalindtags.append(a.rstrip())

    else:

       dna.append(a.rstrip())

dictionary = dict(zip(rosalindtags, dna))

file.close()

I know i'm missing something trivial but I just don't know what it is. Any help is appreciated, Thanks!

ifconfig
  • 6,242
  • 7
  • 41
  • 65
Taha
  • 21
  • 2
  • 1
    I don't think this is a duplicate because I believe the OP probably knows how to concatenate strings -- it's just that he has forgotten or doesn't realize that for this problem he *needs* to concatenate strings. When a Rosalind_id is seen, a string that will be the DNA code needs to be initialized to an empty string. Then subsequent strings up to the next Rosalind_id or the "end of file" must be concatenated together and the final result used. – Booboo Jun 27 '19 at 17:33
  • Right now, `rosalindtags` has length 2 and `dna` has length 1912. The second problem is that a string is iterable so when you append it to a list, each chacater of the string becomes separate element. – Booboo Jun 27 '19 at 17:34
  • Hey if my answer worked for you can you checkmark it. Thanks! – Agent Lu Jul 03 '19 at 21:45
  • Can you checkmark my answer if it worked for you. – Agent Lu Jul 11 '19 at 23:23

3 Answers3

1

The problem is that there's one line for each ids, but multiple lines of DNA. When creating a rosalindtag, you could append an empty string to dna. When you encounter a DNA line, you could add it to the last element of dna:

file = open("rosalind_gc.txt", "r")
data = file.readlines()
rosalindtags = []
dna = []

for a in data:
    if a.startswith(">"):
        rosalindtags.append(a.rstrip())
        dna.append('')
    else:
        dna[-1] = dna[-1] + a.rstrip()

dictionary = dict(zip(rosalindtags, dna))
file.close()

dictionary is then:

{'>Rosalind_8728': 'ATGGAGCCGCACATATAACGGTAAATGCAAAGAAACAGTTCGGGAAAGATATTCAACCAAGGCAACTTCCTGCACTCGTCGCGGGCACGTAGGGAGCCTGACCATCCCTACCCAGACTGTCCCCGATCAGCGAACGGGCCATGCGCTATCAGGTCGATCTAGCACTTGGTAAGTTACGCCAGCTGTACTGAAACAATGCCCGTAGTGACTGAGACGCCAGGGAAAAGGGGATTAAAGCTATGGTAGCCAATCGTCCTAACCTCTAGCCCGCCTGGTATGTAAGAACAAGACATCAGAGATATAGAGGCAGACCGGACCTGCAAGCCGGTCACCTGTGGCTCCCGACAAATGTGGCGTTTAGCTTATGCAAGACCGAAGCTTAGAACCAAGTCGGCTTCGTACCCCTTCTTACCTGTCCACTGCAGTGTTTTGCCTGGATCCGGGTGCGCGTGGCACGAGATCTGCTGAGAAGCTATGAACAATCAAATGTGTAGCCCGCTTACGAAGAATCCAGCCCTGAATTCGGGGGCCAGTCTTCGCCGAACTCCCCCTATTGAGTGGTAAAGTGTGTGACTCCTAGTCTTTTCACCCGAGTCGTTGAATTGTTAGGCTACAGATTTCGCATAGCCCTGATCCAAGCCTTTCTCTGAAAAGATGCGACCTGCATCACTAAGGCCAACCGTGTGTCTCTCCGACATTACGGCAGTGCCACTGATCGCTCACGAACTTGGGAAGCCCCAAAAACTCACATGAGTATGTAGGGCAGTTTTATAGGCTGGGCCCACCCACTTGGTTAGCAAATGGCGCCTGCTCAGAACTCCTTTTACGTAAGTGGTCCCAGTGTGATGGGTCGAGTGAACAAACAAATGTTGACAATTTGCCTCGGGGTTA',
 '>Rosalind_6085': 'CGGATCTGCGTACGGTTGCGTATCCCGTTCAAATGCTCCATCACTCATCACGGAGCCACGTTCCGACCTGCCCACATCTGCGTCTAATACCACGCCAGTACTTACCACGCCGCTGGGTCTTCGAGAACGAGGCTGAATGGGTTTCCGGGGGTGGGAAAGTAATACAAGCGTCATTCGTGAACTGGGACCATGTCATCTGGCGAAGCTATAGTGCGATCGAACTAAACGCTAATACGTCGAAACAGTCTATGGCCGTGAACTTTCTCTAGAGGGTAGGGTTCTTAGCCCCGCCTATTACTTGAACGGATATCAAAGACAGACTTAGCATCTCTGTACCCGCCCTACTGTTGCTTCAAGTCATGCGGAGATTTGTGGGAGCTTGGTCACCTATCGGGCACATCCAGAATGGTCTTTCTCGTAGGTTGAAACAGCCGGGATGCACGTGTGTTTTGTAGGCAAATATAGTGTTTCCGGTGCTAACTAGATTGAGGCAACTCCTATGCCAGAGCATACGGATAGAGACCGAATTGTTTATATGTGCGTTTACCCGATCAGATGCAGTACTTTGGTGGGCAATTTTAGTGAATTGCTCACGTGTTTTAATAACCGGTCCAAGGTTACCTCCCGCCACGTCATAGAGAAATGGGGGAGTATAGAGAGGTAGCTTCTTTCCACACTTGCTTCGAAAAGTGGCCCTCCCTAGGCCACTCCAGATCACTTCCCTCGCAGCCGATACTTTAAATCTGTTCTCGACTGGTTTAACGTTTTGAGCGAGATTGTGCAGGTCTATCGTCGAGTTTTAGGAGAAACCGTGGCTGTCTCAAACCGGTAGCGACCAAGTAACTTGTGTGGTGTGGCGCGTACCCCTTTTCCTTTCCGACAACACTGTACCCCTAGATATAGTGGAATCAGTGAATCAAGATCTACCGGGAATAGACACTCGCTTGAGAAAACATTTCCTC'}

Note that this approach will require a lot of memory if you read a large file.

Here's one alternative which reads the file line by line and only keeps the letter counts in memory:

from collections import Counter

rosalin_id = None
dna = {}

with open("rosalind_gc.txt") as rosalin_f:
    for line in rosalin_f:
        if line.startswith(">"):
            rosalin_id = line.rstrip()
            dna[rosalin_id] = Counter()
        else:
            dna[rosalin_id] += Counter(line.rstrip())

dna

It returns:

{'>Rosalind_8728': Counter({'A': 228, 'T': 202, 'G': 225, 'C': 236}),
 '>Rosalind_6085': Counter({'C': 236, 'G': 237, 'A': 231, 'T': 258})}
Eric Duminil
  • 52,989
  • 9
  • 71
  • 124
1

For a more bioinformatics based approach you can also try downloading biopython which has extension for reading fasta files directly from SwissProt.

from Bio import SeqIO, ExPASy

protein_name = "Rosalind_6085"
with ExPASy.get_sprot_raw(protein_cleaned) as handle:
     seq_record = SeqIO.read(handle, "swiss")

proteinseq = seq_record.seq

From here proteinseq will be a string that you can compare with other strings.

Agent Lu
  • 104
  • 13
0

Well, let's pretend we read it in from a file and stored the results in data, so we can see what we are dealing with:

data = """>Rosalind_8728
ATGGAGCCGCACATATAACGGTAAATGCAAAGAAACAGTTCGGGAAAGATATTCAACCAA
GGCAACTTCCTGCACTCGTCGCGGGCACGTAGGGAGCCTGACCATCCCTACCCAGACTGT
CCCCGATCAGCGAACGGGCCATGCGCTATCAGGTCGATCTAGCACTTGGTAAGTTACGCC
AGCTGTACTGAAACAATGCCCGTAGTGACTGAGACGCCAGGGAAAAGGGGATTAAAGCTA
TGGTAGCCAATCGTCCTAACCTCTAGCCCGCCTGGTATGTAAGAACAAGACATCAGAGAT
ATAGAGGCAGACCGGACCTGCAAGCCGGTCACCTGTGGCTCCCGACAAATGTGGCGTTTA
GCTTATGCAAGACCGAAGCTTAGAACCAAGTCGGCTTCGTACCCCTTCTTACCTGTCCAC
TGCAGTGTTTTGCCTGGATCCGGGTGCGCGTGGCACGAGATCTGCTGAGAAGCTATGAAC
AATCAAATGTGTAGCCCGCTTACGAAGAATCCAGCCCTGAATTCGGGGGCCAGTCTTCGC
CGAACTCCCCCTATTGAGTGGTAAAGTGTGTGACTCCTAGTCTTTTCACCCGAGTCGTTG
AATTGTTAGGCTACAGATTTCGCATAGCCCTGATCCAAGCCTTTCTCTGAAAAGATGCGA
CCTGCATCACTAAGGCCAACCGTGTGTCTCTCCGACATTACGGCAGTGCCACTGATCGCT
CACGAACTTGGGAAGCCCCAAAAACTCACATGAGTATGTAGGGCAGTTTTATAGGCTGGG
CCCACCCACTTGGTTAGCAAATGGCGCCTGCTCAGAACTCCTTTTACGTAAGTGGTCCCA
GTGTGATGGGTCGAGTGAACAAACAAATGTTGACAATTTGCCTCGGGGTTA
>Rosalind_6085
CGGATCTGCGTACGGTTGCGTATCCCGTTCAAATGCTCCATCACTCATCACGGAGCCACG
TTCCGACCTGCCCACATCTGCGTCTAATACCACGCCAGTACTTACCACGCCGCTGGGTCT
TCGAGAACGAGGCTGAATGGGTTTCCGGGGGTGGGAAAGTAATACAAGCGTCATTCGTGA
ACTGGGACCATGTCATCTGGCGAAGCTATAGTGCGATCGAACTAAACGCTAATACGTCGA
AACAGTCTATGGCCGTGAACTTTCTCTAGAGGGTAGGGTTCTTAGCCCCGCCTATTACTT
GAACGGATATCAAAGACAGACTTAGCATCTCTGTACCCGCCCTACTGTTGCTTCAAGTCA
TGCGGAGATTTGTGGGAGCTTGGTCACCTATCGGGCACATCCAGAATGGTCTTTCTCGTA
GGTTGAAACAGCCGGGATGCACGTGTGTTTTGTAGGCAAATATAGTGTTTCCGGTGCTAA
CTAGATTGAGGCAACTCCTATGCCAGAGCATACGGATAGAGACCGAATTGTTTATATGTG
CGTTTACCCGATCAGATGCAGTACTTTGGTGGGCAATTTTAGTGAATTGCTCACGTGTTT
TAATAACCGGTCCAAGGTTACCTCCCGCCACGTCATAGAGAAATGGGGGAGTATAGAGAG
GTAGCTTCTTTCCACACTTGCTTCGAAAAGTGGCCCTCCCTAGGCCACTCCAGATCACTT
CCCTCGCAGCCGATACTTTAAATCTGTTCTCGACTGGTTTAACGTTTTGAGCGAGATTGT
GCAGGTCTATCGTCGAGTTTTAGGAGAAACCGTGGCTGTCTCAAACCGGTAGCGACCAAG
TAACTTGTGTGGTGTGGCGCGTACCCCTTTTCCTTTCCGACAACACTGTACCCCTAGATA
TAGTGGAATCAGTGAATCAAGATCTACCGGGAATAGACACTCGCTTGAGAAAACATTTCC
TC"""

lines = data.splitlines(False)

d = {}
n = len(lines)
i = 0
while i < n:
    line = lines[i]
    if line[0] == ">":
        id = line
        i += 1
        dna = ''
        while i < n:
            line = lines[i]
            if line[0] != '>':
                dna += line
                i += 1
            else:
                break
        d[id] = dna
    else:
        # unexpected, so skip until you find a tag
        i += 1

for k, v in d.items():
    print(k, ':', v, "\n", sep='')

The output will be (with lines split because of my fixed with console):

>Rosalind_8728:ATGGAGCCGCACATATAACGGTAAATGCAAAGAAACAGTTCGGGAAAGATATTCAACCAAGGCAACTTCCTGCACTCGTCGCGGGCACGTAGGGAGCCTGACCATCCCTACCCAGACTGTCCCCGATCAGCGAAC
GGGCCATGCGCTATCAGGTCGATCTAGCACTTGGTAAGTTACGCCAGCTGTACTGAAACAATGCCCGTAGTGACTGAGACGCCAGGGAAAAGGGGATTAAAGCTATGGTAGCCAATCGTCCTAACCTCTAGCCCGCCTGGTATGTAAGAA
CAAGACATCAGAGATATAGAGGCAGACCGGACCTGCAAGCCGGTCACCTGTGGCTCCCGACAAATGTGGCGTTTAGCTTATGCAAGACCGAAGCTTAGAACCAAGTCGGCTTCGTACCCCTTCTTACCTGTCCACTGCAGTGTTTTGCCT
GGATCCGGGTGCGCGTGGCACGAGATCTGCTGAGAAGCTATGAACAATCAAATGTGTAGCCCGCTTACGAAGAATCCAGCCCTGAATTCGGGGGCCAGTCTTCGCCGAACTCCCCCTATTGAGTGGTAAAGTGTGTGACTCCTAGTCTTT
TCACCCGAGTCGTTGAATTGTTAGGCTACAGATTTCGCATAGCCCTGATCCAAGCCTTTCTCTGAAAAGATGCGACCTGCATCACTAAGGCCAACCGTGTGTCTCTCCGACATTACGGCAGTGCCACTGATCGCTCACGAACTTGGGAAG
CCCCAAAAACTCACATGAGTATGTAGGGCAGTTTTATAGGCTGGGCCCACCCACTTGGTTAGCAAATGGCGCCTGCTCAGAACTCCTTTTACGTAAGTGGTCCCAGTGTGATGGGTCGAGTGAACAAACAAATGTTGACAATTTGCCTCG
GGGTTA

>Rosalind_6085:CGGATCTGCGTACGGTTGCGTATCCCGTTCAAATGCTCCATCACTCATCACGGAGCCACGTTCCGACCTGCCCACATCTGCGTCTAATACCACGCCAGTACTTACCACGCCGCTGGGTCTTCGAGAACGAGGCTG
AATGGGTTTCCGGGGGTGGGAAAGTAATACAAGCGTCATTCGTGAACTGGGACCATGTCATCTGGCGAAGCTATAGTGCGATCGAACTAAACGCTAATACGTCGAAACAGTCTATGGCCGTGAACTTTCTCTAGAGGGTAGGGTTCTTAG
CCCCGCCTATTACTTGAACGGATATCAAAGACAGACTTAGCATCTCTGTACCCGCCCTACTGTTGCTTCAAGTCATGCGGAGATTTGTGGGAGCTTGGTCACCTATCGGGCACATCCAGAATGGTCTTTCTCGTAGGTTGAAACAGCCGG
GATGCACGTGTGTTTTGTAGGCAAATATAGTGTTTCCGGTGCTAACTAGATTGAGGCAACTCCTATGCCAGAGCATACGGATAGAGACCGAATTGTTTATATGTGCGTTTACCCGATCAGATGCAGTACTTTGGTGGGCAATTTTAGTGA
ATTGCTCACGTGTTTTAATAACCGGTCCAAGGTTACCTCCCGCCACGTCATAGAGAAATGGGGGAGTATAGAGAGGTAGCTTCTTTCCACACTTGCTTCGAAAAGTGGCCCTCCCTAGGCCACTCCAGATCACTTCCCTCGCAGCCGATA
CTTTAAATCTGTTCTCGACTGGTTTAACGTTTTGAGCGAGATTGTGCAGGTCTATCGTCGAGTTTTAGGAGAAACCGTGGCTGTCTCAAACCGGTAGCGACCAAGTAACTTGTGTGGTGTGGCGCGTACCCCTTTTCCTTTCCGACAACA
CTGTACCCCTAGATATAGTGGAATCAGTGAATCAAGATCTACCGGGAATAGACACTCGCTTGAGAAAACATTTCCTC

If you want the actual counts, then add at the start of the file:

from collections import Counter

And replace d[id] = dna with d[id] = Counter(dna). You then get:

>Rosalind_8728:Counter({'C': 236, 'A': 228, 'G': 225, 'T': 202})

>Rosalind_6085:Counter({'T': 258, 'G': 237, 'C': 236, 'A': 231})
Booboo
  • 38,656
  • 3
  • 37
  • 60