def find_max_score(scores): """ 寻找并返回scores列表中成绩最高的学生信息 :param scores: scores列表 :return: 最高分同学信息 """ max_score = scores[0] for score in scores: if score.score > max_score.score: max_score = score return max_score # 读取文件 filename = dlg.get_open_file_name("选择要打开的文件", dlg.FileFilter.CSVFiles) if filename == '': print("未选择文件") exit(-1) scores = read_csv_file(filename) dlg.show_objects(scores) max_score = find_max_score(scores) dlg.show_message( f"获得最高分的同学:{max_score.id} {max_score.name},成绩为{max_score.score}")
sales.append(sale) return sales def calc_sales_total(sales): """ 计算销售总额 :param sales: 销售记录列表 :return: 销售总额 """ total = 0 for s in sales: amount = s.price * s.quantity total += amount return total filename = dlg.get_open_file_name("请选择csv文件", dlg.FileFilter.CSVFiles) if filename == "": print("未选择文件!") exit(-1) sales = read_csv(filename) dlg.show_objects(sales) total = calc_sales_total(sales) dlg.show_message(f"销售总额{total}")
def filter_by_year(stocks, year): """ 筛选出指定年份的股票信息 :param stocks: 股票信息列表 :param year: 年份 :return: 指定年份的股票信息列表 """ result = [] for s in stocks: if s.pdate.year == year: result.append(s) return result props = 'pdate,pclose,high,low,popen,last_price,change,change_percent,turnover_rate,volume,amount,cap,tradable_cap'.split( ',') prop_names = '日期,收盘价,最高价,最低价,开盘价,前收盘,涨跌额,涨跌幅,换手率,成交量,成交金额,总市值,流通市值'.split(',') filename = dlg.get_open_file_name("请选择股票csv文件", dlg.FileFilter.CSVFiles) if filename == "": print("未选择文件") exit(-1) stocks = read_csv(filename) dlg.show_objects(stocks, fields=props, field_names=prop_names) filtered = filter_by_year(stocks, 2014) dlg.show_objects(filtered, fields=props, field_names=prop_names)
def find_using_index(index,name_key): """ 使用index索引列表,查找姓名等于name_key在scores列表中的下标 :param index: 索引列表 :param name_key: 要查找的姓名 :return: 姓名为name_key的学生。None表示找不到。 """ i_index = hash(name_key) % MAX_INDEX_SIZE items=index[i_index] for item in items: if item.key == name_key: return item.student return None #5-2-2.成绩.csv filename = dlg.get_open_file_name("请选择成绩csv文件",dlg.FileFilter.CSVFiles) if filename == "": print("未选择文件") exit(-1) students = read_csv(filename) dlg.show_objects(students) index = create_index(students) name = dlg.get_string("请输入要查找的姓名") found = find_using_index(index,name) if found is None: dlg.show_message(f"找不到姓名为{name}的学生") else: dlg.show_message(f"id: {found.id} 姓名: {found.name} 成绩:{found.score}")
class UserInfo: def __init__(self, id_, username, name, gender, Tel, password, mail, rank): self.id = id_ self.username = username # 用户名 self.name = name # 用户姓名 self.gender = gender self.Tel = Tel self.password = password self.mail = mail self.rank = rank # 用户级别 filename = 'ex2-1.用户信息.csv' with open(filename, 'r', encoding='utf-8') as file: userls = csv.reader(file) next(userls) users = [] for u in userls: id_, username, name, gender, Tel, password, mail, rank = u[0], u[1], u[2], u[3], u[4], u[5], u[6], u[7] user = UserInfo(id_, username, name, gender, Tel, password, mail, rank) users.append(user) print('id, 账号, 姓名, 性别, 电话号码, 密码, 邮箱, 用户级别') for s in users: print(s.id, s.username, s.name, s.gender, s.Tel, s.password, s.mail, s.rank) dialog.show_objects(users, title='用户信息', width=1500, height=900)
""" 从csv中读取学生信息,并以学号为关键字存入字典中 :param filename: csv文件名 :return: 以学号为关键字的学生信息字典 """ scores = {} with open(filename, mode="r", encoding="UTF-8") as file: reader = csv.reader(file) next(reader) for row in reader: id = row[0] name = row[1] score = Decimal(row[2]) s = Score(id, name, score) scores[id] = s return scores filename = dlg.get_open_file_name("请选择学生成绩文件", dlg.FileFilter.CSVFiles) if filename == "": print("未指定文件") exit(-1) scores = read_csv(filename) dlg.show_objects(list(scores.values())) id = dlg.get_string("请输入要找的学号") if id in scores: s = scores[id] dlg.show_message(f"id: {s.id} 姓名: {s.name} 成绩:{s.score}") else: dlg.show_message(f"找不到id为{id}的学生")
score = Score(id, name, clazz, math, literacy, english) scores.append(score) return scores def key_math(score): return score.math def key_literacy(score): return score.literacy def key_english(score): return score.english filename = dlg.get_open_file_name("请选择数据文件", dlg.FileFilter.CSVFiles) if filename == "": print("未选择文件") exit(-1) props = ['id', 'name', 'clazz', 'math', 'literacy', 'english'] prop_names = ['学号', '姓名', '班级', '数学', '语文', '英语'] scores = read_csv(filename) scores = sorted(scores, key=key_math, reverse=True) dlg.show_objects(scores, fields=props, field_names=prop_names) scores = sorted(scores, key=key_literacy, reverse=True) dlg.show_objects(scores, fields=props, field_names=prop_names) scores = sorted(scores, key=key_english, reverse=True) dlg.show_objects(scores, fields=props, field_names=prop_names)
class Score: def __init__(self, id_, name, class_, math, literature): self.id = id_ self.name = name self.class_ = class_ self.math = math self.literature = literature filename = 'ex2-2.scores.csv' with open(filename, 'r', encoding='utf-8') as fr: scorels = csv.reader(fr) next(scorels) scores = [] for s in scorels: id_, name, class_, math, literature = s[0], s[1], s[2], s[3], s[4] score = Score(id_, name, class_, math, literature) scores.append(score) sum_math = sum_literature = 0 # 初始化数学和语文成绩的和 for score in scores: sum_math += float(score.math) sum_literature += float(score.literature) avg_math = sum_math / len(scores) # 数学平均成绩 avg_literature = sum_literature / len(scores) # 语文平均成绩 print(f'所有同学的数学平均成绩是{avg_math:.2f},语文平均成绩是{avg_literature:.2f}。') dialog.show_objects(scores, title='成绩信息', width=1080, height=720)
if index.name == key_name: return index.index elif index.name < key_name: start = mid+1 else: end = mid - 1 return -1 # 从csv文件中读入学生成绩信息,放到scores列表中 # 5-2-1.成绩.csv filename = dlg.get_open_file_name("请选择成绩csv文件",dlg.FileFilter.CSVFiles) if filename == "": print("未选择文件") exit(-1) scores = read_csv(filename) dlg.show_objects(scores,fields=['id','name','clazz','math','literature','english']) # 创建姓名的折半查找索引 name_indices = create_indices(scores) dlg.show_objects(name_indices) # 使用折半查找索引进行查找 key = dlg.get_string("请输入要查找的姓名") i = find_using_index(name_indices,key) if i == -1: dlg.show_message(f"找不到姓名为{key}的学生") else: dlg.show_message(f"找到了!是{scores[i]}")