问题描述
我有两个文件学生和成绩,必须阅读并转换为字典,最后打印为漂亮的:
成绩:
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 |
+-------+------------+------------------------+
但是请注意,我确实必须更改:
- 您用于正则表达式拆分的
split
,因为\t
没有被我识别 - 在您的
self.path = path
方法中添加了__init__
- 当然还有路径