Python-скрипт, который должен переводить 1000 последовательностей ДНК в белки с помощью 1152 различных кодонов, не работает.

Сейчас работаю над проектом по биоинформатике для дипломной работы. Я написал Python-скрипт, который должен переводить список строк из 1000 ДНК-последовательностей в белки по 1152 различным codontables (генетическим кодам). Эти кодонтаблицы содержатся в списке словарей, которые были получены путем перетасовки ключей и значений (кодонов и аминокислот). Я хочу, чтобы этот скрипт переводил 1000 последовательностей 1152 способами за один раз в консоли IPython или просто в Python-3.6 IDLE. Этот скрипт был написан в Spyder 3.2.7. Я пробовал много способов исправить свой код, но мой скрипт не запускается. Вот мой код:

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

После запуска получаю такую ​​ошибку:

Файл "", строка 8, в

if codontable[dna[i:i+3]] == "_":

TypeError: строковые индексы должны быть целыми числами. Скриншот переменных после запуска скрипта: введите здесь описание изображения Буду очень благодарен за помощь.


person Niels Isaacson    schedule 04.04.2018    source источник
comment
Как говорит ошибка, вы пытаетесь получить доступ к элементам строки с переменной, которая не является целым числом. Я подозреваю, что это строка: dna = DNA_Sequences.pop(0) и DNA_Sequences - это список строк. Так что dna[i:i+3] тоже строка. И бац, ошибка.   -  person pawamoy    schedule 04.04.2018
comment
Да, DNA_Sequences — это список строк, но dna = DNA_Sequences.pop(0) — это просто строка, полученная из DNA_Sequences. Проблема в переменной i, которой присвоено значение 0. Другие строки скрипта, в том числе dna = DNA_Sequences.pop(0), работают отлично.   -  person Niels Isaacson    schedule 04.04.2018
comment
Да, все строки работают нормально, кроме той, что напечатана в ошибке: if codontable[dna[i:i+3]] == "_":. Зная, что i является целым числом, ошибка возникает из-за codontable[...], а не dna[...]. Это потому, что dna[i:i+3] — это строка, и codontable — тоже строка. Вы не можете сделать string[other_string].   -  person pawamoy    schedule 04.04.2018
comment
@Pawamoy, кажется, есть правильный ответ. По сути, codontable нужно целое число в качестве индекса, но dna[i:i+3] - это не целое число, это строка.   -  person Vince    schedule 05.04.2018
comment
Без ваших данных мы мало что можем сделать. Только ты знаешь, что внутри codontable. Добавьте несколько операторов print в цикл, чтобы увидеть, что происходит в деталях.   -  person pawamoy    schedule 07.04.2018
comment
В моем посте скриншот с переменными. Codontable — это, по сути, словарь, который был извлечен из списка словарей.   -  person Niels Isaacson    schedule 07.04.2018
comment
@Pawamoy, как я могу исправить if codontable[dna[i:i+3]] == _: и какая конструкция должна быть вместо этого?   -  person Niels Isaacson    schedule 11.04.2018
comment
@NielsIsaacson, вы можете отлаживать свою программу в общедоступной версии PyCharm. Или попробуйте ipdb в интерпретаторе Python. Если вы понимаете, что вам нужно целое число для доступа к codontable элементам, но не понимаете, почему и как это исправить, предлагаю начать заново с самого начала. Это всего лишь 10-строчный цикл, это не должно быть сложно.   -  person pawamoy    schedule 11.04.2018
comment
@Pawamoy, спасибо за хорошую идею и подсказку для дальнейшей работы)   -  person Niels Isaacson    schedule 12.04.2018
comment
@Pawamoy, я улучшил свой код с помощью PyCharm до этого варианта: if codontable.union[[dna[i:i+3]] == '_': но программа выдала это: break ^ SyntaxError: неверный синтаксис. В остальном сценарий остается прежним. Как я могу исправить эту ошибку? И правильно ли теперь мое выражение if?   -  person Niels Isaacson    schedule 18.04.2018
comment
@NielsIsaacson, кажется, вы пробуете что-то случайным образом, не понимая, что делаете. obj.union[] не является допустимым синтаксисом, ни obj.append[]. Думаю, вам стоит еще раз прочитать туториал на основе Python.   -  person pawamoy    schedule 18.04.2018
comment
@Pawamoy, после анализа моего я отредактировал if-statement так, чтобы он выглядел for item in range(0, len(dna)-(3+len(dna)%3), 3): if codontable.index(dna[item:item + 3]) == "_": break codontable_sequence += codontable.index(dna[item:item + 3]) print(list([codontable_sequence])). Но PyCharm и IPython выдали эту ошибку: codontable_sequence += codontable.index(dna[item:item + 3]) TypeError: must be str, not int.   -  person Niels Isaacson    schedule 20.04.2018
comment
У меня нет времени на поиск нужной части учебника Python, и мне нужно знать конкретное место учебника Python, где описывается объединение разных типов данных в одном выражении. Буду очень благодарен за подсказку в моих поисках.   -  person Niels Isaacson    schedule 20.04.2018
comment
Почему в одном заявлении? Если вы не можете сделать это в одном, разбейте его на несколько операторов. Легче понять и легче отлаживать. Да ладно, чувак, это просто вопрос списка, строк и целых чисел... Я перестану отвечать здесь, это никуда не денется.   -  person pawamoy    schedule 20.04.2018