首页 > 解决方案 > 如何将我的字典添加到漂亮表中

问题描述

我有两个文件学生和成绩,必须阅读并转换为字典,最后打印到漂亮的表格:

成绩:

10103   SSW 567 A   98765
10103   SSW 564 A-  98764
10103   CS 501  B   98764
10115   SSW 567 A   98765
10115   SSW 564 B+  98764

学生:

10103   Baldwin, C  SFEN
10115   Wyatt, X    SFEN

下面是执行此操作的代码:

from collections import  defaultdict
from prettytable import PrettyTable
import os


class University:

    def __init__(self,path):
        self.students=dict()
        self.instructors=dict()             
        self.grades=defaultdict(list)
        

    def gg(self):
        for filename in os.listdir(self.path):
            with open(os.path.join(self.path, filename), 'r') as f:
                if filename=="students.txt":
                    for line in f:
                        
                        a,b,c = line.split("\t")
                        self.students[a] = {
                                "name": b, "major": c}
                
                elif filename=="grades.txt":
                    for line in f:
                        
                        d,e,f,g = line.split("\t")
                        self.grades[d].append({
                                "course": e, "grade": f,"instructor":g})
                        
                        
        pt: PrettyTable = PrettyTable(
            field_names=[
                'CWID',
                'Name',
                'cc',])    
        for i,j in self.students.items():
            for x,y in self.grades.items():
                if i==x:
                    pt.add_row([i,j["name"],y["course"]])

                
        return pt

a = University("C://Users/Swayam/Documents/Downloads")
c = a.gg()
print(c)

输出应该是:

10103 Baldwin,C SSW567,SSW564,CS501
10115 Wyatt, X  SSW 567,SSW564

当我运行上面的代码时,我得到以下错误:

TypeError: list indices must be integers or slices, not str

我不应该使用 add_row 行中的变量,我知道这一点,但是我可以用什么替换它,以便获得输出。

标签: python-3.xclassdictionarydefaultdictprettytable

解决方案


您的代码的问题是这y是一个列表:

for i,j in self.students.items():
    for x,y in self.grades.items():
        print(type(y))
>>> <class 'list'>

这是因为您定义的代码grades

self.grades=defaultdict(list)

因此,您需要一些额外的代码来浏览字典列表:

courses = ",".join(h["course"] for h in y)

因此,最终代码变为:

from collections import defaultdict
from prettytable import PrettyTable
import os


class University:
    def __init__(self, path):
        self.students = dict()
        self.instructors = dict()
        self.grades = defaultdict(list)
        self.path = path

    def gg(self):
        for filename in os.listdir(self.path):
            with open(os.path.join(self.path, filename), "r") as f:
                if filename == "students.txt":
                    for line in f:

                        a, b, c = line.split("\t")
                        self.students[a] = {"name": b, "major": c}

                elif filename == "grades.txt":
                    for line in f:

                        d, e, f, g = line.split("\t")
                        self.grades[d].append(
                            {"course": e, "grade": f, "instructor": g}
                        )

        pt: PrettyTable = PrettyTable(
            field_names=[
                "CWID",
                "Name",
                "cc",
            ]
        )

        for i, j in self.students.items():
            for x, y in self.grades.items():
                if i == x:
                    courses = ",".join(h["course"] for h in y)
                    pt.add_row([i, j["name"], courses])

        return pt


a = University("C://Users/Swayam/Documents/Downloads")
c = a.gg()
print(c)

运行上面的代码时,我得到了这个输出:

+-------+------------+------------------------+
|  CWID |    Name    |           cc           |
+-------+------------+------------------------+
| 10103 | Baldwin, C | SSW 567,SSW 564,CS 501 |
| 10115 |  Wyatt, X  |    SSW 567,SSW 564     |
+-------+------------+------------------------+

但是请注意,我确实必须更改:

  1. split你用来正则表达式拆分的,因为我\t没有得到认可
  2. 添加self.path = path到您的__init__方法中
  3. 当然,路径也是

推荐阅读