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

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

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

成绩:

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. 当然还有路径

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?
Java在半透明框架/面板/组件上重新绘画。
Java“ Class.forName()”和“ Class.forName()。newInstance()”之间有什么区别?
在此环境中不提供编译器。也许是在JRE而不是JDK上运行?
Java用相同的方法在一个类中实现两个接口。哪种接口方法被覆盖?
Java 什么是Runtime.getRuntime()。totalMemory()和freeMemory()?
java.library.path中的java.lang.UnsatisfiedLinkError否*****。dll
JavaFX“位置是必需的。” 即使在同一包装中
Java 导入两个具有相同名称的类。怎么处理?
Java 是否应该在HttpServletResponse.getOutputStream()/。getWriter()上调用.close()?
Java RegEx元字符(。)和普通点?