以表格格式打印嵌套字典

2024-05-19 03:38:03 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在尝试以表格格式打印嵌套词典。但一直未能做到这一点。该表列出了学生姓名和成绩。我希望它是一个“报告卡”类型的格式,易于阅读。我使用的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

    },
}

这是我当前使用的for循环

for i in student:
    for j in student[i]:
        print(j + " : " + str(student[i][j]))
    print("===========")

我想用表格格式打印出来

Name Grade Math English Physics Chemistry
Eddy   1    78      65     89        80
Jim    2    89      65     87        76
Jane   3    87      97     75        64

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

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


Tags: nameinforenglish格式mathstudent表格
3条回答

首先:print()作为默认值,在末尾添加new line,因此如果要在一行中显示,则必须使用print(..., end="")


我认为你应该学习string formatting——见第^{a1页。这样,您可以更好地控制行中的元素,而不是使用空格或\t

它需要一次处理所有元素,而不是使用内部for-loop,但这提供了更好的控制,并且需要更简单的代码

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"]))

我使用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 

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     |
+------+-------+------+---------+---------+-----------+

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

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

昨天碰巧写了一篇。分享它

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

    },
}

columns = list(student.values())[0].keys()
width = [len(col) for col in columns ]
print(" ".join(columns))
col_format = []
for w in width:
    if len(col_format) == 0:
        col_format.append("%s")
    else:
        col_format.append("%" + str(w) + "d")
str_col_format = " ".join(col_format)

for vals in student.values():
    values = list(vals.values())
    values[0] = f"{values[0].ljust(width[0])}"
    print(str_col_format % tuple(values))

这里有一个pandas解决方案,正如您提到的,尝试熊猫失败了。您可以将^{}orient=index一起使用

import pandas as pd

df = pd.DataFrame.from_dict(student, orient='index').reset_index(drop=True)

你得到

    Name    Grade   Math    English Physics Chemistry
0   Eddy    1       78      65      89      80
1   Jim     2       89      65      87      76
2   Jane    3       87      97      75      64

对于markdown

print(df.to_markdown(index=False))

| Name   |   Grade |   Math |   English |   Physics |   Chemistry |
|:-------|--------:|-------:|----------:|----------:|------------:|
| Eddy   |       1 |     78 |        65 |        89 |          80 |
| Jim    |       2 |     89 |        65 |        87 |          76 |
| Jane   |       3 |     87 |        97 |        75 |          64 |
  • 与其他实现相比,pandas的优势在于,数据现在的格式便于分析和绘图
import matplotlib.pyplot as plt

df.plot.barh(x='Name', y=['Math', 'English', 'Physics', 'Chemistry'], figsize=(6, 8))
plt.xlabel('Score')
plt.legend(title='Subject', bbox_to_anchor=(1.05, 1), loc='upper left')

enter image description here

相关问题 更多 >

    热门问题