遍历列表并删除某些元素

时间:2014-03-09 18:12:08

标签: python build

我正在我的计算机课上完成一项作业,而且我在编写代码的一部分时遇到了困难。我将发布作业指南(粗体部分是我遇到问题的代码):

  

您将创建一个模拟的蚁群,用户将在其中   扮演女王的角色,她将负责管理健康   殖民地。模拟将以回合制的方式进行,   每转一次,用户可以选择花费宝贵的食物资源   更多的蚂蚁。

     

首先创建一个包含两个类的python文件Ants.py:Colony和   Ant

     

Colony类将有一个工蚁列表(最初为空),a   食物量(最初为10种)和3种方法:

     
      
  • breedWorker()
  •   
  • step()
  •   
  • purge()
  •   
     

breedWorker() 创建一个新的Ant并将其添加到殖民地的列表中   工蚁。创造一个工人需要花费5个殖民地的食物。如果有   食物不足,应该向用户打印一条消息而不是   应该创造蚂蚁。

     

step() 处理每个回合的殖民地自动行为。   也就是说,这种方法将控制每只蚂蚁的行为   殖民地。每转一蚂蚁应该从殖民地的食物中吃一种食物   供应。如果没有足够的食物,蚂蚁将失去一分   健康相反。然后每只蚂蚁都会觅食(如下所述),   所发现的任何食物都会被添加回殖民地的食物供应中。

     

purge() 扫描工蚁列表,并从列表中删除任何健康状况为0的蚂蚁。每只死蚂蚁加1食物供应,   因为蚂蚁回收了!      

我无法理解如何确保列表中的所有蚂蚁都具有健康状况,而且我不确定如何从列表中删除健康状况为零的蚂蚁。 < / p>      

Ant班级将

     
      
  • 健康(最初设定为10)
  •   
  • forage()方法
  •   
     

forage() 随机确定蚂蚁在搜索时的运气   每回合吃一次。

     
      
  • 蚂蚁在一次可怕的事故中死亡的可能性为5%(健康状况   = 0,不返回食物)
  •   
  • 蚂蚁有40%的机会找到食物。找到的金额应该是1到5之间的随机数。
  •   
  • 有一个   蚂蚁没有食物的几率为50%。
  •   
  • 有5%的可能性   蚂蚁发现甜蜜的花蜜!她的健康得到补充(即设定为   10)她带回10个食物到殖民地!每个结果   蚂蚁的觅食应该为用户打印并返回。
  •   
     

最后,您需要编写main()方法来启动   模拟并反复提示用户进行选择。每一回合   用户应该可以选择培养新员工(费用为5)   食物),或什么都不做(没有新的蚂蚁)。您的代码应该检查用户的   输入错误并再次询问它是否无效。跟随用户的   行动(品种与否),殖民地将按照描述采取“一步”   以上,最后,所有死亡的蚂蚁都应该从殖民地清除。   模拟应该像这样重复,直到殖民地都在两者之外   蚂蚁和足够的食物可以制造更多的蚂蚁。

这是我的代码:

import random

class Colony(object):

    def __init__(self):
        Colony.food = 10
        Colony.numWorkerAnts = 0
        Colony.workerAnts = []      

     def breedWorker(self):     
         print ("Breeding worker...")
         Colony.numWorkerAnts += 1
         Colony.food -= 5
         Colony.workerAnts.append(1)
         if (Colony.food < 5):
            print ("Sorry, you do not have enough food to breed a new worker ant!")

     def step(self):
         for i in range(0,len(Colony.workerAnts)):
            Colony.food -= 1

class Ant(object):

    def __init__self(self):
    Ant.health = 10

    def forage(self):
    foodFound = random.random()
    if (foodFound <= 0.05):
       print("Ant has died in an accident!")
       Ant.health = 0 
    if (foodFound > 0.05 and foodFound < 0.40):
       amountFood = random.randint(1,5)
       print("Ant finds "+str(amountFood)+" food.") 
       Colony.food += amountFood    
    if (foodFound >= 0.40 and foodFound < 0.95):
       print("Ant worker returns empty handed.")
    if (foodFound >= 0.95):
       print("Your ant finds sweet nectar! Ant returns "+str(amountFood)+" to the colony and health is restored to "+str(self.health)+"!")
       amountFood = 10
       Ant.health = 10 
       Colony.food = amountFood + Colony.food

def main():
    colony = Colony()
    ant = Ant()
    while (Colony.numWorkerAnts >= 1 or Colony.food >= 5):
    print ("Your colony has "+str(Colony.numWorkerAnts)+" ants and "+str(Colony.food)+" food, Your Majesty.")
    print ("What would you like to do?")
    print ("0. Do nothing")
    print ("1. Breed worker (costs 5 food)")
    prompt = '> '
    choice = int(raw_input(prompt))

    if (choice == 1):
        colony.breedWorker()
        colony.step()
        for i in range(0, len(Colony.workerAnts)):
            ant.forage()    
    else:
        for i in range(0, len(Colony.workerAnts)):
            ant.forage()    
            colony.step()
main()

1 个答案:

答案 0 :(得分:0)

目前,当您使用ClassName.attr时,您正在将所有内容属性设置为在类的所有实例之间共享。相反,您应该使用self.attr将所有内容都设为实例属性:

class Colony(object):

    def __init__(self):
        self.food = 10
        self.workerAnts = [] # numWorkerAnts is just len(workerAnts)

请注意,您应该更改breedWorker以将新的Ant实例添加到self.workerAnts列表中;目前,它只会增加计数。

为了减少有健康的蚂蚁的殖民地,你可以使用列表理解:

self.workerAnts = [ant for ant in self.workerAnts if ant.health]