以表格格式打印嵌套字典

Pyt*_*981 4 python dictionary nested pandas

我正在尝试以表格格式打印嵌套字典。但一直没能做到。该表是学生姓名和学生成绩的列表。我希望它采用易于阅读的“报告卡”类型格式。我正在使用的 for 循环打印出结果。但它是一栏列表形式。

这是我当前设置的字典。

student = {
    "student1": {
        "Name": "Eddy",
        "Grade": 1,
        "Math": 78,
        "English": 65,
        "Physics": 89,
        "Chemistry": 80
    },
    "student2": {
        "Name": "Jim",
        "Grade": 2,
        "Math": 89,
        "English": 65,
        "Physics": 87,
        "Chemistry": 76

    },
    "student3": {
        "Name": "Jane",
        "Grade": 3,
        "Math": 87,
        "English": 97,
        "Physics": 75,
        "Chemistry": 64

    },
}
Run Code Online (Sandbox Code Playgroud)

这是我当前使用的 for 循环。

for i in student:
    for j in student[i]:
        print(j + " : " + str(student[i][j]))
    print("===========")
Run Code Online (Sandbox Code Playgroud)

我想以表格格式打印出来。

Name Grade Math English Physics Chemistry
Eddy   1    78      65     89        80
Jim    2    89      65     87        76
Jane   3    87      97     75        64
Run Code Online (Sandbox Code Playgroud)

我尝试使用该format()函数,但无法使其与嵌套字典一起使用。

我也尝试使用pandas并转换为 a pd.DataFrame,但无法使其工作。

fur*_*ras 5

第一:print()默认添加new line在末尾,所以如果你想在一行中显示,那么你必须使用print(..., end="")


我认为你应该学习string formatting- 请参阅页面pyFormat.info。这样您可以更好地控制行中的元素,然后使用空格或\t

它需要同时处理所有元素,而不是使用内部for循环,但这提供了更好的控制并且需要更简单的代码。

for stud, val in student.items():
    print("{:4} {:^5} {:^4} {:^7} {:^7} {:^9}".format(val["Name"], val["Grade"], val["Math"], val["English"], val["Physics"], val["Chemistry"]))
Run Code Online (Sandbox Code Playgroud)

我曾经items()获取一名学生的所有值,然后使用val["Name"],val["Grade"}等,所以我确信我将值按正确的顺序放置。

我用来{}定义在字符串中放置元素的位置,并使用{:^5}我定义它应该使用具有 5 个字符的字段(如果文本较短,它将添加空格),并且^意味着它应该在此字段中居中值。

Name Grade Math English Physics Chemistry
Eddy   1    78    65      89       80    
Jim    2    89    65      87       76    
Jane   3    87    97      75       64 
Run Code Online (Sandbox Code Playgroud)

string formatting可以与任何其他文本一起使用{}来装饰表格。例如,您可以|在字段之间放置来创建

+------+-------+------+---------+---------+-----------+
| Name | Grade | Math | English | Physics | Chemistry |
+------+-------+------+---------+---------+-----------+
| Eddy |   1   |  78  |   65    |   89    |    80     |
| Jim  |   2   |  89  |   65    |   87    |    76     |
| Jane |   3   |  87  |   97    |   75    |    64     |
+------+-------+------+---------+---------+-----------+
Run Code Online (Sandbox Code Playgroud)
student = {
    "student1": {
        "Name": "Eddy",
        "Grade": 1,
        "Math": 78,
        "English": 65,
        "Physics": 89,
        "Chemistry": 80
    },
    "student2": {
        "Name": "Jim",
        "Grade": 2,
        "Math": 89,
        "English": 65,
        "Physics": 87,
        "Chemistry": 76

    },
    "student3": {
        "Name": "Jane",
        "Grade": 3,
        "Math": 87,
        "English": 97,
        "Physics": 75,
        "Chemistry": 64

    },
}

print('Name Grade Math English Physics Chemistry')

for stud, val in student.items():
    print("{:4} {:^5} {:^4} {:^7} {:^7} {:^9}".format(val["Name"], val["Grade"], val["Math"], val["English"], val["Physics"], val["Chemistry"]))

print('+------+-------+------+---------+---------+-----------+')
print('| Name | Grade | Math | English | Physics | Chemistry |')
print('+------+-------+------+---------+---------+-----------+')

for stud, val in student.items():
    print("| {:4} | {:^5} | {:^4} | {:^7} | {:^7} | {:^9} |".format(val["Name"], val["Grade"], val["Math"], val["English"], val["Physics"], val["Chemistry"]))

print('+------+-------+------+---------+---------+-----------+')
Run Code Online (Sandbox Code Playgroud)

顺便说一句:为了使其更加通用,您可以使用列表'Name', 'Grade', 'Math', 'English', 'Physics', 'Chemistry']来决定显示哪些值。您可能还需要计算列宽度的代码,但这将是更复杂的代码。