如何解决列表中的项目问题

时间:2019-10-11 21:36:07

标签: python list

我正在尝试制作一个程序,如果某个条件通过,则将其从一组列表中删除,如果某个其他条件发生,则将其复制。但是我有以下问题:程序在100的迭代50中时,它会标记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 \ User \ Desktop \ Archivos pavos \ Sublime Text   3 \ pruebas_phyton.pyw“,第4921行,如果fitl_copy [i] <   best_fitness:#Fitness [i] <=最差健身* 4 IndexError:列表索引   超出范围

1 个答案:

答案 0 :(得分:1)

  

当程序在100的迭代50中时,它将标记IndexError并关闭。

这是线索;问题发生在过程的一半。这是尝试remove from a list while iterating over it的标志;每次循环时都删除一个元素,因此50次之后i == 50仍然只有50个元素在列表中,因此索引超出范围。

为什么会这样?好吧...

fitl_copy = fitness # lista de floats

这不会复制fitness;它使fitness成为另一个名称

因此,这两行...

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

在同一列表上操作;和繁荣。

我认为您应该首先尝试重新考虑算法。我的猜测是,您根本不需要做所有从列表中弹出的操作。我认为,如果您:

  • 重写,以便从头开始创建一个包含所有新生物的 new 列表(空列表)

  • 在执行此操作时,请保留旧生物列表,然后将其替换为最后的新列表

您还可以从为动物使用某种结构化数据中受益,而不是拥有所有属性的平行列表。以及使用列表推导和生成器代替for循环。