Python 列表。删除(x):x不在列表中

Python 列表。删除(x):x不在列表中,python,list,Python,List,Python 2.7.5 我在其他问题上找不到这个,所以我会问 该计划应: 创造一个有机体种群 从种群中随机选择两种生物 如果这两个有机体都是黑色的,删除它们,然后创建一个新的黑色有机体 实际发生的情况: 我的程序正在给出一个列表。removex:x不在列表中,当它非常清楚地在列表中时。 错误仅出现在第50行而不是第49行: Python说它不能将其从列表中删除,但它不应该首先尝试将其从列表中删除第44行 我很困惑为什么它会这样做,我是否遗漏了一些明显的东西 import random as r

Python 2.7.5

我在其他问题上找不到这个,所以我会问

该计划应:

创造一个有机体种群

从种群中随机选择两种生物

如果这两个有机体都是黑色的,删除它们,然后创建一个新的黑色有机体

实际发生的情况:

我的程序正在给出一个列表。removex:x不在列表中,当它非常清楚地在列表中时。 错误仅出现在第50行而不是第49行: Python说它不能将其从列表中删除,但它不应该首先尝试将其从列表中删除第44行

我很困惑为什么它会这样做,我是否遗漏了一些明显的东西

import random as r
import os
import sys
import time


class Organism(object):
    def __init__(self, color_code):
        self.color_code = color_code
        self.color = None
        if self.color_code == 0:
            self.color = 'black'
        if self.color_code == 1:
            self.color = 'white'




population_count = []
#Generates initial population
for organism in range(r.randint(2, 4)):
    org = Organism(0)
    population_count.append(org)

#Prints the color_traits of the different organisms

print "INITIAL"
for color in population_count:
    print color.color
print "INITIAL"




class PopulationActions(object):
    def __init__(self, pop):
        self.population_count = pop

    def Crossover(self, population):
        #Select 2 random parents from population
        parent1 = population[r.randint(0, (len(population) -1))]
        parent2 = population[r.randint(0, (len(population) -1))]
        #If both parents are 'black' add organism with black attribute and kill parents
        if parent1.color == "black" and parent2.color == "black":
            if parent1 in population and parent2 in population:
                org = Organism(0)
                population.append(org)
                print "__________ADDED ORGANISM_______________"
                population.remove(parent1)
                population.remove(parent2)
                print "__________KILLED PARENTS_______________"
        else:
            pass
#Main loop
pop = PopulationActions(population_count)
generation = 0
while generation <= 3:
    print "~~~~~~~~~~~~~~~~~~~~~~~~~~~~"
    pop.Crossover(population_count)
    #Print colors of current population
    for color in population_count:
        print color.color
    generation += 1
raw_input()

如果parent1==parent2怎么办?然后删除此行中的parent1和parent2:

人口1.removeparent1


如果parent1==parent2怎么办?然后删除此行中的parent1和parent2:

人口1.removeparent1


父母2真的不在列表中

当你随机选择父母两个都是同一生物体时,我怀疑你得到了你描述的错误。第一次调用list.remove时,您将其从列表中删除,但第二次调用失败,因为该生物体已经消失

我不确定你是否打算让同一个有机体被采摘两次。如果是这样,您需要检查第二次调用以删除:

另一方面,如果你不想两次选择同一个生物体,你需要改变选择父母的方式。这里有一个简单的修复方法,不过还有其他方法:

parent1, parent2 = random.sample(population, 2)

我怀疑你在随机选择双亲中的同一个有机体时犯了你所描述的错误。第一次调用list.remove时,您将其从列表中删除,但第二次调用失败,因为该生物体已经消失

我不确定你是否打算让同一个有机体被采摘两次。如果是这样,您需要检查第二次调用以删除:

另一方面,如果你不想两次选择同一个生物体,你需要改变选择父母的方式。这里有一个简单的修复方法,不过还有其他方法:

parent1, parent2 = random.sample(population, 2)

是的,这正是它失败时所发生的情况。如果人口规模很小,发生这种情况的概率很高。在这种情况下,四分之一的人在最好的情况下,二分之一的人在最坏的情况下。是的,这正是它失败时所发生的情况。如果种群规模很小,发生这种情况的概率很高。在这种情况下,最好的情况是四分之一,最坏的情况是二分之一。啊!谢谢你的回答,你现在可以打我的脸了!您还应该使用if parent1不是parent2,因为您想知道它们是否是相同的实例。这就是random.sample所做的。@davidmm:您有一点,第一个代码块应该使用的可能不是而不是!=。幸运的是,对于没有定义自己的_ne_______________________________________________,这不是计算更密集吗?啊!谢谢你的回答,你现在可以打我的脸了!您还应该使用if parent1不是parent2,因为您想知道它们是否是相同的实例。这就是random.sample所做的。@davidmm:您有一点,第一个代码块应该使用的可能不是而不是!=。幸运的是,对于没有定义自己的_ne_______________________________________________,这难道不是更需要计算吗?