Python 3.x 如何将字典添加到prettytable
我有两个文件,学生和成绩必须阅读并转换成字典,最后打印到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
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 |
+-------+------------+------------------------+