如何将我的字典添加到漂亮的

问题描述

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

成绩:

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

这是因为您在代码中定义了 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. 当然还有路径

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...