繁体   English   中英

以表格格式打印嵌套字典

[英]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_dictorient=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')

在此处输入图像描述

首先: 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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM