解决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
相关产品推荐
相关产品推荐

