python-3.x - 如何将我的字典添加到漂亮表中
问题描述
我有两个文件学生和成绩,必须阅读并转换为字典,最后打印到漂亮的表格:
成绩:
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__
方法中 - 当然,路径也是
推荐阅读
- c++ - 获取 SFML 窗口的 HWND 和 HInstance?
- excel - 用字母数字字符计算
- vue.js - Change vue router route without changing the URL
- flutter - 如何在 ListTitle 的前导参数中添加自定义图标
- python - Converting list items to string, question on syntax?
- python - 如何根据 Pandas 中第一个数据帧中的某些列值从第二个数据帧添加列值
- php - Laravel/ PHP- 404 路由返回不存在的页面
- python - IndexError: list index out of range coursera assignment
- javascript - 如何在不超时的情况下从javascript中的字符串中删除元音?
- c++ - 使用 C++ 和 i2c-tools 从虚拟 i2c 写入和读取