Python 3.x 如何将字典添加到prettytable

Python 3.x 如何将字典添加到prettytable,python-3.x,class,dictionary,defaultdict,prettytable,Python 3.x,Class,Dictionary,Defaultdict,Prettytable,我有两个文件,学生和成绩必须阅读并转换成字典,最后打印到prettytable: 等级: 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 c

我有两个文件,学生和成绩必须阅读并转换成字典,最后打印到prettytable:

等级:

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行中的变量,我知道这一点,但是我可以用什么来替换它以获得输出。

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

for i,j in self.students.items():
    for x,y in self.grades.items():
        print(type(y))
>>> <class '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     |
+-------+------------+------------------------+
然而,请注意,我确实必须改变:

  • 您用于正则表达式拆分的
    拆分
    ,因为
    \t
    没有被我识别
  • self.path=path
    添加到您的
    \uuuu init\uuu
    方法中
  • 当然,道路也是如此

  • 这仍然使j[“name”]出现相同的错误,我尝试在j中为h添加name=“,”.join(h[“name”]但它抛出了一个关键错误我现在包含了完整的代码和我得到的输出,这是您正在运行的代码吗?我对
    j[“name”]没有任何问题
    因为
    j
    应该是一个包含关键字
    名称的词典
    +-------+------------+------------------------+
    |  CWID |    Name    |           cc           |
    +-------+------------+------------------------+
    | 10103 | Baldwin, C | SSW 567,SSW 564,CS 501 |
    | 10115 |  Wyatt, X  |    SSW 567,SSW 564     |
    +-------+------------+------------------------+