You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

解决AnimalShelter队列list index out of range问题及元素检查

解决AnimalShelter类的IndexError问题

问题根源

当前adopt_any方法直接通过self.cats[0]['order']这类语句访问队列首元素,但如果某类动物队列为空,会直接抛出IndexError: list index out of range。比如测试代码中只添加了猫和狗,仓鼠队列为空,调用adopt_any就会触发错误。

简洁解决方案

核心思路是仅从非空队列中筛选候选元素,避免直接访问空列表索引。以下是两种优化方案:

方案1:列表收集候选(直观易读)

修改adopt_any方法,先收集所有非空队列的类型和对应首元素的order,再从中选出order最小的类型执行领养:

def adopt_any(self):
    # 收集非空队列的类型与首元素order
    candidates = []
    if self.cats:
        candidates.append(("cat", self.cats[0]['order']))
    if self.dogs:
        candidates.append(("dog", self.dogs[0]['order']))
    if self.hamsters:
        candidates.append(("hamster", self.hamsters[0]['order']))
    
    if not candidates:
        return print("No animals available!")
    
    # 找到order最小的动物类型
    kind, _ = min(candidates, key=lambda x: x[1])
    
    # 映射到对应领养方法并执行
    return {
        "cat": self.adopt_cat,
        "dog": self.adopt_dog,
        "hamster": self.adopt_hamster
    }[kind]()

方案2:生成器+异常捕获(代码紧凑)

用生成器表达式过滤空队列,配合min函数找最小order,通过try-except处理无动物可领养的情况:

def adopt_any(self):
    # 生成器仅产出非空队列的order、类型和队列本身
    candidates = (
        (animal_list[0]['order'], kind, animal_list)
        for kind, animal_list in [
            ("cat", self.cats),
            ("dog", self.dogs),
            ("hamster", self.hamsters)
        ]
        if animal_list
    )
    
    try:
        _, kind, _ = min(candidates)
    except ValueError:
        return print("No animals available!")
    
    return {
        "cat": self.adopt_cat,
        "dog": self.adopt_dog,
        "hamster": self.adopt_hamster
    }[kind]()

额外优化:简化add_animal方法

用字典映射动物类型到队列,替代冗余的elif判断,后续扩展新动物类型更方便:

def add_animal(self, name, kind):
    kind = kind.lower()
    self.order += 1
    animal = {"name": name, "type": kind, "order": self.order}
    
    animal_map = {
        "cat": self.cats,
        "dog": self.dogs,
        "hamster": self.hamsters
    }
    
    if kind in animal_map:
        animal_map[kind].append(animal)
    else:
        print("Invalid kind.")

完整优化后代码

class AnimalShelter:
    def __init__(self):
        self.cats = []
        self.dogs = []
        self.hamsters = []
        self.order = 0
    
    def add_animal(self, name, kind):
        kind = kind.lower()
        self.order += 1
        animal = {"name": name, "type": kind, "order": self.order}
        
        animal_map = {
            "cat": self.cats,
            "dog": self.dogs,
            "hamster": self.hamsters
        }
        
        if kind in animal_map:
            animal_map[kind].append(animal)
        else:
            print("Invalid kind.")
    
    def adopt_any(self):
        candidates = []
        if self.cats:
            candidates.append(("cat", self.cats[0]['order']))
        if self.dogs:
            candidates.append(("dog", self.dogs[0]['order']))
        if self.hamsters:
            candidates.append(("hamster", self.hamsters[0]['order']))
        
        if not candidates:
            return print("No animals available!")
        
        kind, _ = min(candidates, key=lambda x: x[1])
        
        return {
            "cat": self.adopt_cat,
            "dog": self.adopt_dog,
            "hamster": self.adopt_hamster
        }[kind]()
     
    def __adopt_animal__(self, animal_list):
        if len(animal_list) == 0:
            return print("None!")
        else:
            return animal_list.pop(0)
   
    def adopt_cat(self):
        return self.__adopt_animal__(self.cats)
    
    def adopt_dog(self):
        return self.__adopt_animal__(self.dogs)
    
    def adopt_hamster(self):
        return self.__adopt_animal__(self.hamsters)
    
    def show_animals(self):
        print(self.cats)
        print(self.dogs)
        print(self.hamsters)

# 测试代码
animalShelter = AnimalShelter()
animalShelter.add_animal("c1", "cat")
animalShelter.add_animal("d1", "dog")
animalShelter.adopt_any()
animalShelter.show_animals()

运行上述测试代码,不会再触发IndexError,且能正常领养最早加入的动物(c1)。

内容的提问来源于stack exchange,提问作者bigidulka

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.08 12:05:28