Исправление ошибки с присвоением пустого списка значению «DNA_Sequence» - PullRequest
0 голосов
/ 30 апреля 2018

Итак, этот вопрос является продолжением предыдущего поста Python-скрипт, который должен переводить 1000 ДНК-последовательностей в белки с помощью 1152 различных кодонабельных таблиц, не работает . С того времени я редактировал скрипт в PyCharm, и теперь этот скрипт выглядит так:

import yaml
file = open('/home/ihor/Документи/біоінформатика/DNA_Sequence72 - Копія.py', 'r')
DNA = file.read()
DNA_Sequences = DNA.split(',')
Genetic_Codes = open('/home/ihor/Документи/біоінформатика/Genetic_Codes.py', 'r')
Genetic_Codes = Genetic_Codes.read()
Genetic_Codes_list = Genetic_Codes.split('\n')
for row in range(1152): #for str in list[Genetic_Codes_list] in range(1152):
    Alternative_Genetic_Codes = Genetic_Codes_list.pop(0)
    for line in range(1000):
        dna = DNA_Sequences.pop(0)
        codontable = yaml.load(Alternative_Genetic_Codes)
        codontable_sequence = ""
        for i in range(0, len(dna)-(3 + len(dna) % 3), 3):
            if codontable.get(dna[i:i + 3], codontable_sequence) == "_":
                break
            codontable_sequence += codontable.get(dna[i:i + 3], codontable_sequence)
        print(list([codontable_sequence]))

А теперь в этом скрипте есть только одна ошибка:

IndexError: всплывающее из пустого списка

После исследования переменных в Debugger, я увидел, что переменной DNA_Sequences в строке DNA_Sequences = DNA.split(',') было присвоено значение '[] (пустой список)'. Мой скрипт переводит список строк из 1000 ДНК-последовательностей в белок только по 1 кодируемому словарю (словарю), но я хочу, чтобы этот скрипт переводил список строк из 1000 ДНК-последовательностей в белки по 1152 различным кодонтаблиям за один прогон. Я прочитал много учебников и других источников об этой ошибке, списках и т. Д., Но я не нашел решения для своей проблемы. Все остальные переменные полностью в порядке. Как я могу исправить эту ошибку с пустым списком? Я буду очень благодарен за вашу помощь.

Ответы [ 2 ]

0 голосов
/ 30 апреля 2018

pop удаляет элементы из массива, поэтому первая итерация вашего внешнего цикла создает пустой массив. Решение состоит в том, чтобы получить доступ к элементам массива по индексу, не удаляя их:

for line in range(1000):
    dna = DNA_Sequences[line]
0 голосов
/ 30 апреля 2018

Ваш код не имеет смысла. Но, тем не менее, ответ состоит в том, чтобы проверить, является ли элемент пустым, если это так, пройдите.

for row in range(1152): #for str in list[Genetic_Codes_list] in range(1152):
    Alternative_Genetic_Codes = Genetic_Codes_list.pop(0)
    for line in range(1000):
        if len(DNA_Sequences) == 0:
            pass
        else:
            dna = DNA_Sequences.pop(0)
            codontable = yaml.load(Alternative_Genetic_Codes)
            codontable_sequence = ""
            for i in range(0, len(dna)-(3 + len(dna) % 3), 3):
                if codontable.get(dna[i:i + 3], codontable_sequence) == "_":
                    break
                codontable_sequence += codontable.get(dna[i:i + 3], codontable_sequence)
            print(list([codontable_sequence]))

Вы действительно должны использовать biopython или подобное.

...