индекс списка вне диапазона, когда код все еще работает? - PullRequest
0 голосов
/ 18 июня 2020

Я относительно новичок в python, и я работал над алгоритмом, который включает генетический c код. Я начал с связывания всех 4 генети c баз, A, C, T, G со списком. А равно 1,0,0,0. C равно 0,1,0,0. T равно 0,0,1,0, а G равно 0,0,0,1. Существует два разных генетических кода c, один из которых является исходным, а другой - генетически мутированным. Алгоритм будет делать выводы на основе предоставленных данных на основе разницы между двумя кодами geneti c. Но сначала мне нужно предварительно обработать данные, прежде чем я смогу работать над алгоритмом, делая выводы.

Код пока выглядит следующим образом:

A = [1, 0, 0, 0]
C = [0, 1, 0, 0]
T = [0, 0, 1, 0]
G = [0, 0, 0, 1]
original = [A, T, T, G, C, T, A]
copy = [C, T, T, A, T, A, A]
final = original
for i, v in enumerate(original):
    if v == copy[i]:
        print(v)
    elif v != copy[i]:
        final.insert(i, 1)
        print(final)

Я получаю сообщение об ошибке «индекс вне допустимого диапазона». Однако программа по-прежнему работает, но появляется ошибка. Во-первых, стоит ли мне вообще об этом беспокоиться и означает ли это что-нибудь? Во-вторых, если это важно, как мне это исправить? Если нет, то почему это вообще происходит? Я также пробовал разные компиляторы кода, такие как google collab и Pycharm. enter image description here

Я новичок в Python, так что может быть что-то маленькое, что я не замечаю. Любая помощь будет очень признательна!

Ответы [ 2 ]

3 голосов
/ 18 июня 2020

Это происходит потому, что final и original указывают на одно и то же место в памяти. Итак, когда вы вставили значения в final в этой строке кода:

final.insert(i, 1)

... original переменная также была отражена, и в конце концов не было значения в i -м месте в copy здесь:

if v == copy[i]:

Решение :

Вы создали копию списка:

final = original[:]
# or: final = original.copy()
1 голос
/ 18 июня 2020

Причиной проблемы root является следующая строка:

final = original

Вы можете подумать, что final - это новый список, который содержит те же значения, что и original. Но на самом деле это относится к тому же списку .

Теперь в этом l oop,

for i, v in enumerate(original):
        # ...
        final.insert(i, 1)

вы не только изменяете список final , но, поскольку на самом деле это тот же список , также original. Следовательно, итерация по original расширяется и приводит к значениям i, которые больше, чем разрешено в качестве индекса для списка copy (который изначально имел тот же размер, что и original).

Поэтому вы получаете ошибку «Индекс списка вне допустимого диапазона» для строки if v == copy[i], что фактически означает, что i стало больше len(copy) - 1.

Чтобы избежать этой ошибки, вам необходимо создать final как фактическую копию original, что можно сделать с помощью

final = original[:]

или

final = list(original)

См. Как клонировать или скопировать список? для еще большего количества опций.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...