[英]Print Nested Dictionary in Table Format
我正在尝试以表格格式打印我的嵌套字典。 但是一直没能做到。 该表是学生姓名和学生成绩的列表。 我希望它采用易于阅读的“报告卡”类型格式。 我正在使用的 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()
function 但无法使其与嵌套字典一起使用。
我还尝试使用pandas
并转换为pd.DataFrame
,但无法使其工作。
这是一个pandas解决方案,正如您提到的,尝试 pandas 失败。 您可以将pandas.DataFrame.from_dict
与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 |
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')
首先: 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"]))
我使用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('+------+-------+------+---------+---------+-----------+')
顺便说一句:为了使其更通用,您可以使用列表'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))
可能不是最优雅的方式,但它确实有效。
print('\t'.join(['Name', 'Grade', 'Math', 'English', 'Physics', 'Chemistry']))
for stud in student:
for topic in student[stud]:
print(student[stud][topic], end='\t')
print()
def get_keys(my_dict):
keys = list(my_dict.keys())
keys = my_dict[keys[0]].keys()
keys = list(keys)
return keys
# get headers
keys = get_keys(students)
# print header
for key in keys:
print("%10s " %key, end="")
print("\n")
# print body
for values in students.values():
for key in keys:
print("%10s "%str(values[key]), end="")
print("\n")
(这不一定将 Name 打印为第一列)
您可以将dict
的.values()
传递给pandas.DataFrame
import pandas as pd
student = ...
df = pd.DataFrame(student.values())
print(df.to_string(index=False))
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.