python 如何使用用户输入、循环和空格解析来编写字典?

nwsw7zdq  于 2023-09-29  发布在  Python
关注(0)|答案(3)|浏览(93)

我试图创建一个字典,我可以序列化到一个json文件。这是我第一次尝试,所以我很困惑。
我希望用户输入患者的名字、姓氏、年龄和性别,因此字典输出如下所示:

"patients": [
    {
      "first_name": "Jane",
      "last_name": "Doe",
      "age": 33,
      "gender": f,
     }
  ]
}

我希望每个用户输入都在一行中,直到循环被打破。到目前为止,我只有:

patients = {}

info = input("Enter first name, last name, age, and gender separated by space. Enter stop to stop:")
 
for key, value in patients.items():
    print('first_name: {}, last_name: {}, age: {}, gender: {}'. format(key, value))

我如何设置我的代码,使用户可以继续输入信息,直到循环被打破?我怎样才能使字典输出如上所示,以便每个输入都是分开的,并相应地显示为字典键的值?我真的不知道从哪里开始,任何帮助都很感激!

aamkag61

aamkag611#

这个程序应该做你需要的。添加了注解,以了解每行的详细功能。

import json

# defines a dictionary with a list of patients as value
patients = {"patients": []}

# initializes the info variable
info = ""

# run a loop to capture comma separated values from user until they ask to stop
while (info != "stop"):
    info = input("Enter first name, last name, age, and gender separated by space. Enter stop to stop: ")
    if (info != "stop"):
        # splits the input by comma to form a data list
        data = info.split(",")
        # create a patient entry from the data list, using positions and trims any white spaces, converts age to number
        patient_entry = {"first_name": data[0].strip(" "), "last_name": data[1].strip(" "), "age": int(data[2]), "gender": data[3].strip(" ")}
        # adds the patient entry to the patient dictionary
        patients["patients"].append(patient_entry)

# opens a json file to write to and dumps the dictionary content into the file as json
json_file = open("patients.json", "w")
json.dump(patients, json_file)

这段代码期望每一个输入行都是精确的单词stop,或者它有四个逗号分隔的值,格式为精确的string, string, number, string。如果你想处理不同的输入,需要在代码中添加如下的输入验证。

  • 检查data的长度是否为4
  • 检查第三个条目是否确实是一个数字

patients.json的内容如下所示

{
    "patients": [
        {
            "first_name": "John",
            "last_name": "Doe",
            "age": 45,
            "gender": "m"
        },
        {
            "first_name": "Jane",
            "last_name": "Doe",
            "age": 40,
            "gender": "f"
        }
    ]
}
km0tfn4u

km0tfn4u2#

首先,看起来您需要一个包含一组字典的列表,因此我将patients变量更新为一个列表。
第二,可以使用while循环继续提示用户输入。对于每个条目,您可以将新字典追加到列表中。
最后,要在一行上打印每个字典,可以循环遍历患者列表并输出每个字典项。

patients = []

add_entry = True

def add_patient():
    patient_dict = {}
    patient_dict["first_name"] = input("Enter first name: ")
    patient_dict["last_name"] = input("Enter last name: ")
    patient_dict["age"] = input("Enter age: ")
    patient_dict["gender"] = input("Enter gender: ")
    patients.append(patient_dict)
    return 0

while add_entry:
    add_patient()
    add_new = input("Enter another patient (y/n): ")
    if add_new == "n":
        add_entry = False

for patient in patients:
    print(patient)

输出如下所示:

{'first_name': 'John', 'last_name': 'Doe', 'age': '33', 'gender': 'm'}
{'first_name': 'Jane', 'last_name': 'Smith', 'age': '21', 'gender': 'f'}
inkz8wg9

inkz8wg93#

  • "....."*

将代码放入循环中,并使用 boolean 变量。

m = {'patients': []}
exit = False
while not exit:
    if (i := input()) == '': exit = True
    else:
        a, b, c, d = i.split()
        if '' in (a, b, c, d): exit = True
        else:
            m['patients'].append([
                {'first_name': a},
                {'last_name': b},
                {'age': int(c)},
                {'gender': d}
            ])

下面是格式化后的输出。
与JSON略有不同,我知道。

abc xyz 123 m
xyz abc 321 f

{'patients': 
    [
        [
            {'first_name': 'abc'}, 
            {'last_name': 'xyz'}, 
            {'age': 123}, 
            {'gender': 'm'}
        ], 
        [
            {'first_name': 'xyz'}, 
            {'last_name': 'abc'}, 
            {'age': 321}, 
            {'gender': 'f'}
        ]
    ]
}
  • "...我如何使字典输出如上所示,以便每个输入都是分开的,并相应地显示为字典键的值?..."*

您只需将输出格式化为 JSON
这可以像 string-format 一样简单,或者使用 JSON 模块。

相关问题