【问题标题】:Iterate through a list and delete certain elements遍历列表并删除某些元素
【发布时间】:2014-04-12 17:19:31
【问题描述】:

我正在计算机课上完成一项作业,但我很难处理其中的一段代码。我将发布分配指南(粗体部分是我遇到问题的代码):

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

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

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

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

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

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

purge() 扫描工蚁列表,将所有生命值为 0 的蚂蚁从列表中移除。对于每只死蚂蚁,食物供应量增加 1, 因为蚂蚁循环利用!

我不知道如何确保列表中的所有蚂蚁都有健康,我不确定如何从列表中删除健康为零的蚂蚁。

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()

【问题讨论】:

  • 您遇到的错误或面临的问题是什么?
  • 很不清楚你在问什么 - 你真正做的只是为我们抄写你的家庭作业。
  • 我无法理解如何确保列表中的所有蚂蚁都具有健康状况,并且我不确定如何从列表中删除健康状况为零的蚂蚁。
  • @hivert 在您进行编辑时请不要从帖子中删除相关信息(查看问题的修订历史以查看您删除的内容)
  • @MarissaLeigh 不是你要问的,但你应该培育一个新工人之前检查是否有足够的食物。您的代码存在很多问题 - 我建议您与您的教授或学生助理交谈以帮助您。

标签: python build


【解决方案1】:

目前,您正在使所有内容成为类属性,在类的所有实例之间共享,因为您使用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]

【讨论】:

  • 一开始我的一切都是self.attr,但每当我厌倦了运行main() 方法时,我就无法使用类中的变量。这行代码给了我一个错误:("Your colony has "+str(Colony.numWorkerAnts)+" ants and "+str(Colony.food)+" food, Your Majesty.")
  • 你想访问那里的 instance,而不是类; colony.food 不是 Colony.food
  • 我想我可能发现我的代码有问题。有人可以向我解释如何创建一个工作蚂蚁数组,以便每次繁殖蚂蚁时都会添加蚂蚁数组?
  • self.workerAnts.append(Ant()) 将在殖民地的工人列表中添加一个全新的 Ant 实例
猜你喜欢
  • 2012-01-13
  • 2020-03-15
  • 1970-01-01
  • 1970-01-01
  • 2014-07-31
  • 1970-01-01
  • 2013-08-05
  • 2012-06-13
  • 2021-12-15
相关资源
最近更新 更多