Python 向预先存在的字典键追加新值

Python 向预先存在的字典键追加新值,python,function,class,dictionary,key-value,Python,Function,Class,Dictionary,Key Value,set\u more函数用于将新值附加到现有键,这给我带来了问题,我真的找不到原因 info = {} class Dog: def __init__(self,info): info["Name"] = input("Set:\nDog's name: ") info["Age"] = input("Dog's age: ") info["Breed

set\u more
函数用于将新值附加到现有键,这给我带来了问题,我真的找不到原因

info = {}
class Dog:
    def __init__(self,info):
        info["Name"] = input("Set:\nDog's name: ")
        info["Age"] = input("Dog's age: ")
        info["Breed"] = input("Dog's breed: ")
    def get_info(self,info):
        self.info = list(info.values())
        infs = []
        for i in range(len(self.info)):
            infs.append(self.info[i])
        print(infs)
        return infs
    def set_more(self,info):
        info.setdefault("Name", []).append(input("Set:\nDog's Name: "))
        info.setdefault("Age", []).append(input("Dog's Age: "))
        info.setdefault("Breed", []).append(input("Dog's Breed: "))  
d = Dog(info)
d.get_info(info)
d.set_more(info)
d.get_info(info)
有两个错误

  • 正如Schwobasegll提到的,您需要将字典的值初始化为列表,以便以后可以附加到它们。您可以使用括号:
    [输入(狗的年龄:)]

  • 不要使用
    setdefault
    ,只需执行
    info[“Field”].append()
    。详细说明
    setdefault
    ,它只返回具有给定键的字段值。它不允许您更改字典

  • 下面是完整的更正代码

    info = {}
    class Dog:
        def __init__(self,info):
            info["Name"] = [input("Set:\nDog's name: ")]
            info["Age"] = [input("Dog's age: ")]
            info["Breed"] = [input("Dog's breed: ")]
        def get_info(self,info):
            self.info = list(info.values())
            infs = []
            for i in range(len(self.info)):
                infs.append(self.info[i])
            print(infs)
            return infs
        def set_more(self,info):
            info["Name"].append(input("Set:\nDog's Name: "))
            info["Age"].append(input("Dog's Age: "))
            info["Breed"].append(input("Dog's Breed: "))  
    d = Dog(info)
    d.get_info(info)
    d.set_more(info)
    d.get_info(info)
    
    有两个错误

  • 正如Schwobasegll所提到的,您需要将字典的值初始化为列表,以便以后可以附加到字典中。您可以使用括号:
    [input(Dog's age:)]

  • 不要使用
    setdefault
    ,只需执行
    info[“Field”].append()
    。详细说明
    setdefault
    ,它只返回具有给定键的字段值。它不允许你更改字典

  • 下面是完整的更正代码

    info = {}
    class Dog:
        def __init__(self,info):
            info["Name"] = [input("Set:\nDog's name: ")]
            info["Age"] = [input("Dog's age: ")]
            info["Breed"] = [input("Dog's breed: ")]
        def get_info(self,info):
            self.info = list(info.values())
            infs = []
            for i in range(len(self.info)):
                infs.append(self.info[i])
            print(infs)
            return infs
        def set_more(self,info):
            info["Name"].append(input("Set:\nDog's Name: "))
            info["Age"].append(input("Dog's Age: "))
            info["Breed"].append(input("Dog's Breed: "))  
    d = Dog(info)
    d.get_info(info)
    d.set_more(info)
    d.get_info(info)
    

    使用字典方法来处理对象。与Java或其他语言相比,Python有一个非常实用的字典。
    Dog
    属于
    dictionary
    类型

    get_info
    获取
    姓名
    品种
    年龄
    的输入。将它们放入列表并返回列表

    set\u info
    需要列表输入。它将列表中的元素相应地分配给
    狗的元素

    Dog = {}
    def get_info():
        info = {}
        info["Name"] = input("Set:\nDog's name: ")
        info["Age"] = input("Dog's age: ")
        info["Breed"] = input("Dog's breed: ")
    
        print("\n Input Info: \n")
        print(info)
        return info
    def set_more(info):
        Dog[info['Name']] = {"Age" : info["Age"], "Breed": info["Breed"]}
       #If you want the Name to be a list item instead of a key:
       #Dog[info['Name']] = {"Name" : info["Name"], "Age" : info["Age"],"Breed": info["Breed"]}
    
        print("\n Dogs: \n")
        print(Dog)
        print()
        
    Dog = {}
        
    set_more(get_info())
    set_more(get_info())
    
    这段代码与您的代码完全相同,只是我使用了dictionary对象而不是创建对象

    注意:我通常不会仅仅为赋值创建另一个函数,但我认为您可能需要
    getter
    setter
    方法。如果不需要,只需使用一个函数获取输入并将其附加到
    Dog
    字典,如下所示:

    def get_info():
        info["Name"] = input("Set:\nDog's name: ")
        info["Age"] = input("Dog's age: ")
        info["Breed"] = input("Dog's breed: ")
        Dog[info['Name']] = {"Age" : info["Age"], "Breed": info["Breed"]}
        print("\n Input Info: \n")
        print(info)
        return info
    
    每次您调用
    get_info
    ,它都会请求输入,并将它们附加到
    Dog
    。这样,整个功能将是:

    info = {}
    Dog = {}
    def get_info():
        info["Name"] = input("Set:\nDog's name: ")
        info["Age"] = input("Dog's age: ")
        info["Breed"] = input("Dog's breed: ")
    
        Dog[info['Name']] = {"Age" : info["Age"], "Breed": info["Breed"]}
    
        print("\n Input Info: \n")
        print(info)
        return info
    
    get_info()
    

    使用字典方法来处理对象。与Java或其他语言相比,Python有一个非常实用的字典。
    Dog
    属于
    dictionary
    类型

    get_info
    获取
    姓名
    品种
    年龄
    的输入。将它们放入列表并返回列表

    set\u info
    需要列表输入。它将列表中的元素相应地分配给
    狗的元素

    Dog = {}
    def get_info():
        info = {}
        info["Name"] = input("Set:\nDog's name: ")
        info["Age"] = input("Dog's age: ")
        info["Breed"] = input("Dog's breed: ")
    
        print("\n Input Info: \n")
        print(info)
        return info
    def set_more(info):
        Dog[info['Name']] = {"Age" : info["Age"], "Breed": info["Breed"]}
       #If you want the Name to be a list item instead of a key:
       #Dog[info['Name']] = {"Name" : info["Name"], "Age" : info["Age"],"Breed": info["Breed"]}
    
        print("\n Dogs: \n")
        print(Dog)
        print()
        
    Dog = {}
        
    set_more(get_info())
    set_more(get_info())
    
    这段代码与您的代码完全相同,只是我使用了dictionary对象而不是创建对象

    注意:我通常不会仅仅为赋值创建另一个函数,但我认为您可能需要
    getter
    setter
    方法。如果不需要,只需使用一个函数获取输入并将其附加到
    Dog
    字典,如下所示:

    def get_info():
        info["Name"] = input("Set:\nDog's name: ")
        info["Age"] = input("Dog's age: ")
        info["Breed"] = input("Dog's breed: ")
        Dog[info['Name']] = {"Age" : info["Age"], "Breed": info["Breed"]}
        print("\n Input Info: \n")
        print(info)
        return info
    
    每次您调用
    get_info
    ,它都会请求输入,并将它们附加到
    Dog
    。这样,整个功能将是:

    info = {}
    Dog = {}
    def get_info():
        info["Name"] = input("Set:\nDog's name: ")
        info["Age"] = input("Dog's age: ")
        info["Breed"] = input("Dog's breed: ")
    
        Dog[info['Name']] = {"Age" : info["Age"], "Breed": info["Breed"]}
    
        print("\n Input Info: \n")
        print(info)
        return info
    
    get_info()
    

    它给你带来了什么问题?我不明白为什么一条狗会有多个名字、年龄和品种。你为什么要在一个字符串后面加上。为什么不分配呢?注意:字典会更容易,我想你会尝试对类字段使用dict,这通常是Python在幕后所做的(除非你使用_slot)。我将使用class attribute
    self.name
    而不是维护一个外部dict。我还将把输入放在类外部或特定的非初始化方法中。当然,如前所述,如果要堆叠值,则需要将字段初始化为列表
    self.name=[init\u name]
    这会给您带来什么问题?我不明白为什么一条狗会有多个名字、年龄和品种。你为什么要在一个字符串后面加上。为什么不分配呢?注意:字典会更容易,我想你会尝试对类字段使用dict,这通常是Python在幕后所做的(除非你使用_slot)。我将使用class attribute
    self.name
    而不是维护一个外部dict。我还将把输入放在类外部或特定的非初始化方法中。当然,如前所述,如果要堆叠值,则需要将字段初始化为列表
    self.name=[init\u name]
    Wow。谢谢!我没想到今天会有回复,更不用说像这样的回复了。非常感谢。哇。谢谢!我没想到今天会有回复,更不用说像这样的回复了。非常感谢你。