Каков наилучший способ в этом сценарии, чтобы избежать путаницы l oop? - PullRequest
1 голос
/ 14 января 2020

Итак, я могу sh редактировать список, состоящий из классов, этот код представляет собой симуляцию двух животных, поедающих друг друга. Эта функция касается одного животного (хищника), поедающего другое животное (добычу). Чтобы избежать того, что l oop станет "испорченным", когда я уберу одно животное из списка, я решил сделать это следующим образом: самый сильный хищник должен есть первым, и он должен съесть самую слабую добычу, проверяя вероятность если он будет пытаться или не пытаться съесть добычу.

def eat_predator(self):
    if len(self.specie_classes["Prey"]) > 0:
        self.specie_classes["Predator"].sort(
            key=lambda specie: specie.strength, reverse=True
        )
        for pred in self.specie_classes["Predator"]:
            prey_survivors= []
            food_apetite= pred.req['Apetite'] # This is how much food he wishes to eat
            current_food = 0
            self.specie_classes["Prey"].sort(
                key=lambda specie: specie.strength
            )
            for prey in self.specie_classes["Prey"]:
                if food_apetite >= current_food:
                    break

                if specie.determine_kill(prey):
                    current_food += prey.weight
                    pred.increase_eat_weight(prey.weight)
                    prey_survivors = [
                        surv_prey
                        for surv_prey in self.specie_classes["Prey"]
                        if surv_prey != prey
                    ]

            self.specie_classes["Prey"] = prey_survivors

Это мое текущее решение, основной вопрос в том, как избежать создания нового списка каждый раз, когда я хочу обновить список, содержащий классы Prey (animal) (без нарушения итерации)

Вот чего я буду sh избегать:

d = list(range(10))
for n in d:
    print('Testing', n)
    if n % 2 == 0 or n % 3 == 0:
        d.remove(n)
print(d)

Testing 0
Testing 2
Testing 4
Testing 6
Testing 8
[1, 3, 5, 7, 9] 

Ответы [ 2 ]

2 голосов
/ 14 января 2020

Один из способов - создать список / набор с индексами, которые нужно удалить, а затем воссоздать d, исключив эти индексы:

In [74]: d = list(range(10))                                                                                                                                                                                                                                                                                            

In [75]: deleteme = set()  # we'll track the indices to be deleted, here                                                                                                                                                                                                                                                                                             

In [76]: for i,n in enumerate(d): 
    ...:     if n%2==0 or n%3==0: 
    ...:         deleteme.add(i)  # delete this index
    ...:                                                                                                                                                                                                                                                                                                                

In [77]: d = [e for i,e in enumerate(d) if i not in deleteme]                                                                                                                                                                                                                                                           

In [78]: d                                                                                                                                                                                                                                                                                                              
Out[78]: [1, 5, 7]
0 голосов
/ 14 января 2020

Я могу придумать пару различных альтернатив.

1) У каждого атрибута есть атрибут isAlive, и обновите его вместо удаления животного. Делая это таким образом, итерация списка не будет испорчена.

2) Создайте копию списка, а затем удалите животных только из одной копии. Таким образом, оригинальный порядок и индексы сохраняются.

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