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

如何在Python列表中以Dog对象的id重命名对象并保留属性

解决方法

首先修改Dog类,添加__repr__方法,让打印列表时能直观看到狗的id等信息,替代默认的内存地址显示:

class Dog:
    def __init__(self, name, age, breed, id):
        self.name = name
        self.age = age
        self.breed = breed
        self.id = id

    def __repr__(self):
        return f"Dog(id='{self.id}', name='{self.name}', breed='{self.breed}')"

以下提供两种满足你需求的实现方式:

方式一:列表+字典组合(简单直接)

保留原dogs列表用于索引访问,同时新增一个字典映射id到对应Dog对象,实现按id快速定位:

dogs = []
dog_id_map = {}  # 存储id到Dog对象的映射

intake = input("Enter the number of dogs to intake:")

for i in range(int(intake)):
    name = input("Name of dog: ")
    age = input("Age of dog: ")
    breed = input("Breed of dog: ")
    dog_id = input("Dog ID: ")
    new_dog = Dog(name, age, breed, dog_id)
    dogs.append(new_dog)
    dog_id_map[dog_id] = new_dog  # 将新对象加入映射字典

使用示例:

# 通过索引修改对象属性
dogs[0].age = 3
# 通过id访问对象并修改属性
dog_id_map['dog001'].name = "Buddy"

# 打印列表,显示自定义格式
print(dogs)
# 输出示例:[Dog(id='dog001', name='Buddy', breed='Labrador'), Dog(id='dog002', name='Max', breed='Poodle')]

# 通过id直接获取对象
print(dog_id_map['dog001'])

方式二:自定义混合类(统一结构)

如果想要一个同时支持索引和id访问的单一结构,可以自定义继承自list的类,内部维护id映射:

class DogList(list):
    def __init__(self):
        super().__init__()
        self.id_map = {}

    def add_dog(self, dog):
        self.append(dog)
        self.id_map[dog.id] = dog

    def get_by_id(self, dog_id):
        return self.id_map.get(dog_id, None)

    # 可选:支持直接用[]传入id获取对象
    def __getitem__(self, key):
        if isinstance(key, str):
            return self.id_map.get(key)
        return super().__getitem__(key)

使用示例:

dog_list = DogList()

intake = input("Enter the number of dogs to intake:")

for i in range(int(intake)):
    name = input("Name of dog: ")
    age = input("Age of dog: ")
    breed = input("Breed of dog: ")
    dog_id = input("Dog ID: ")
    new_dog = Dog(name, age, breed, dog_id)
    dog_list.add_dog(new_dog)

访问与修改:

# 通过索引访问修改
dog_list[0].age = 4
# 通过id访问修改(两种方式)
dog_list.get_by_id('dog001').name = "Charlie"
# 或者直接用[]传入id
dog_list['dog001'].breed = "Golden Retriever"

# 打印列表
print(dog_list)

两种方式都能保留列表的索引修改能力,同时支持通过狗的id快速访问对象,且修改对象属性时所有引用都会同步更新(因为指向的是同一个实例)。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.18 13:32:45