Как решить проблему с элементами в списке - PullRequest
0 голосов
/ 12 октября 2019

Я пытаюсь создать программу, которая удаляет определенные элементы из группы списков, если выполняется определенное условие, и дублирует их, если происходит определенное другое. Но у меня есть следующая проблема: , когда программа находится в итерации 50 из 100, она помечает IndexError и закрывает .

Вот фрагмент кода, в котором у меня возникла проблема:

nnl_len = len(neuralNetworkList) # longitud de lista de objetos
    fitl_copy = fitness # lista de floats
    best_fitness_reproduced = 0 

    if worst_fitness < 0 and first_iteration == 0: # supongo que esto se
        worst_fitness = 0                          # puede ignorar


        for i in range(nnl_len):
            print(i)
            if fitl_copy[i] < best_fitness: # LINEA EXACTA DEL ERROR <------------------
                print("I DIED WITH A FITNESS OF ",fitness[i], ", BEING THE LIMIT ",best_fitness)
                neuralNetworkList.pop(i)    
                x.pop(i)
                y.pop(i)
                fitness.pop(i)
                colors.pop(i)
            elif fitl_copy[i] == best_fitness and best_fitness_reproduced:
                print("I DIED BECAUSE A TOP FITNESS CREATURE ALREADY REPRODUCED ",fitness[i])
                neuralNetworkList.pop(i)    
                x.pop(i)
                y.pop(i)
                fitness.pop(i)
                colors.pop(i)               
            else:           
                best_fitness_reproduced = 1
                for j in range(99): # plus the mother is 100
                    print("I SURVIVED WITH A FITNESS OF ",fitness[i], ", BEING THE LIMIT ",best_fitness)                    
                    neuralNetworkList.append(neuralNetworkList[i])
                    if random.randint(1,3) == 1:
                        neuralNetworkList[i].mutate(i)
                    x.append(width)
                    y.append(height)
                    fitness.append(0)

                    newcolor = []

                    for h in range(3):
                        newcolor.append(round( colors[i][h]*random.choice((0.9, 1.1)) ))

                    colors.append(newcolor)     
            #except IndexError:
            #   pass
            #   print("I NEITHER DIED NOR REPRODUCED BECAUSE OF AN INDEX ERROR")

        nnl_len = len(neuralNetworkList)

        for i in range(nnl_len):
            x[i] = width
            y[i] = height
            fitness[i] = 0

        print("population after reproduction:", len(neuralNetworkList))

ОБНОВЛЕНИЕ:

Трассировка (последний последний вызов):

Файл "C: \ Users \ Пользователь \ Рабочий стол \ Archivos pavos \ Sublime Text 3 \ pruebas_phyton.pyw", строка 4921, если if fitl_copy [i]

1 Ответ

1 голос
/ 12 октября 2019

, когда программа находится в итерации 50 из 100, она помечает IndexError и закрывается.

Это ключ;проблема происходит в середине процесса. Это признак попытки удалить из списка во время итерации по нему ;каждый раз в цикле вы удаляете элемент, поэтому после 50 раз у вас есть i == 50 и только 50 элементов остаются в списке, поэтому индекс выходит за пределы.

Почему это происходит? Ну ...

fitl_copy = fitness # lista de floats

Это не делает копию fitness; делает другое имя для fitness.

Следовательно, эти две строки ...

if fitl_copy[i] < best_fitness:
    # ...
    fitness.pop(i)

работают в одном списке;и бум.

Я думаю, вы должны сначала попытаться переосмыслить свой алгоритм. Я предполагаю, что вам вообще не нужно делать все эти списки из списков. Я думаю, вам будет намного легче, если вы:

  • Перепишите, чтобы вы создали список new со всеми существами для нового поколения, начиная сСкретч (пустой список)

  • Оставьте старый список существ в покое, пока вы делаете это, а затем просто замените его новым списком в конце

Вы также можете воспользоваться некоторыми структурированными данными для своих существ вместо того, чтобы иметь параллельные списки со всеми их атрибутами;а также используя списки и генераторы вместо циклов for.

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