将新值附加到预先存在的字典键

Appending new values to pre-existing dictionary keys

旨在将新值附加到现有键的 set_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)

有2个错误。

  1. 正如 schwobaseggl 所提到的,您需要将字典的值初始化为列表,以便稍后可以附加到它们。您可以使用方括号来做到这一点:[input(Dog's age: ")]

  2. 不要使用 setdefault,只需使用 info["Field"].append()。详细说明 setdefault,它仅 returns 具有给定键的字段的值。它不允许您更改字典。

下面是更正后的完整代码。

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 获取 namebreedage 的输入。将它们放入列表中,然后 returns 列表。

set_info 需要列表输入。它将列表的元素相应地分配给 Dog 的元素。

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())

除了我使用字典对象而不是创建对象外,此代码与您的代码做的事情完全相同。

注意:我通常不会仅仅为了赋值而创建另一个函数,但我认为您可能同时需要 gettersetter 方法。如果你不需要它,你可以简单地使用一个函数来获取输入并将它们附加到 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()