练习:查询学生新学期选课(python之str、dict、list试炼)

news2024/9/20 20:30:35

查询学生新学期选课(python之str、dict、list试炼),数据用字典、列表存储。考验字符串的各种转换,字典、列表的读写。


(本文获得CSDN质量评分【88】)

【学习的细节是欢悦的历程】

  • Python 官网:https://www.python.org/

  • Free:大咖免费“圣经”教程《 python 完全自学教程》,不仅仅是基础那么简单……


  自学并不是什么神秘的东西,一个人一辈子自学的时间总是比在学校学习的时间长,没有老师的时候总是比有老师的时候多。
            —— 华罗庚


  • My CSDN主页、My HOT博、My Python 学习个人备忘录
  • 好文力荐、 老齐教室
等风来,不如追风去……


算法实操:
Python代码实现直插排序
(含有序在前有序在后)


本文质量分:

88
本文地址: https://blog.csdn.net/m0_57158496/article/details/128194951

CSDN质量分查询入口:http://www.csdn.net/qc


目 录

  • ◆ 查询学生新学期选课
    • 1、题目
    • 2、算法分析
    • 3、代码实现
      • 3.1 拆分字符串数据
      • 3.2 获取学生成功选课信息
      • 3.3 查询学生选课
    • 4、代码运行效果截屏
    • 5、完整源码


◆ 查询学生新学期选课

1、题目

在这里插入图片描述在这里插入图片描述


回页目录

2、算法分析

   1. 从输入字符串拆分出数据:课程数m、选课学生人数n、课程及容量、参加选课学生选课情况、要查询的学生列表。2. 定算法:先根据规则生成学生成功选课信息,再从中进行查询。3. 定数据存储类型:课程及容量、参加选课学生选课点数信息用dict,查询学生用list。4. 代码实现。


回页目录

3、代码实现

3.1 拆分字符串数据

# 输入字符串
input_s = '''
4 5
gaoshu 3
xiandai 2
jigaic 5
gailvlun 6
2100210001 gaoshu 50 xiandai 40 jigaic 10
2100210002 gaoshu 50 jigaic 5 gailvlun 45
2100210003 gaoshu 80 xiandai 20
2100210004 xiandai 70 jigaic 10 gailvlun 20
2100210005 gaoshu 50 xiandai 50
2100210001 2100210003 2100210005 2100210006
'''

# 解析数据:m、n、备选课程、学生选课信息、查询学生
input_s = input_s[1:-1].split('\n')
m, n = map(int, input_s[0].split()) # 提取课程数m和选课人数n。
classes = input_s[1:m+1] # 备选课程和课程容量。
classes = {k: int(v) for k,v in map(lambda x: x.split(), classes)} # 解析式生成备选课程字典。
students = map(lambda x: x.split(), input_s[m+1:m+n+1]) # 学生选课信息。
students = {int(i[0]): {k: int(v) for k,v in zip(*[iter(i[1:])]*2)} for i in students} # 字典解析式生成学生选课信息字典。
findall = list(map(int, input_s[-1].split())) # 查询学生。

3.2 获取学生成功选课信息

  根据题目规则得到所有参加选课学生成功选课信息。用{学号: 选课列表}的字典形式存储,方便查询。

# 根据选课规则生成学生成功选课信息字典。
choice_classes = {} # 初始化成功选课信息字典。

def class_sort(class_s):
    ''' 生成学生选课点数高低的列表 '''
    temp = [(k, v.get(class_s, 0)) for k,v in students.items()] # 解析学生选课点数。
    temp.sort(key=lambda x: x[1]) # 按选课点数排序。
    return [i for i in temp if i[1] != 0] # 剔除选课点数为0的记录。

for class_s,n in classes.items(): 轮询备选课程字典,记录学生课程选取。
    lis = class_sort(class_s) # 获取学生选课点数列表。
    #print(class_s, lis) 
    for i in range(n): # 用pop()方法根据课程容量直接由高到低选取,选课点数相同,学号大的在后。

        if lis == []:
            break

        k,v = lis.pop()
        choice_classes[k] = choice_classes.get(k, []) + [class_s] # 列表记录成功选取课程。
    #input(choice_classes)

3.3 查询学生选课

   轮询查询学生(学号)列表,用dict.get(学号)方法从学生成功选课信息字典中获取选取课程。

# 输出
print(f"\n\n{' 输出 ':~^48}\n\n{', '.join(map(str, findall)):^50}\n\n{' 查询 ':~^48}\n\n")

for student in findall:
    temp = choice_classes.get(student)
    if temp:
        print(f"{'':>18}{', '.join(temp)}")
    else:
        print(f"{'':>18}{'None'}")


回页目录

4、代码运行效果截屏

在这里插入图片描述


回页目录

5、完整源码

(源码较长,点此跳过源码)
#!/usr/bin/nve python
# coding: utf-8

# 输入字符串
input_s = '''
4 5
gaoshu 3
xiandai 2
jigaic 5
gailvlun 6
2100210001 gaoshu 50 xiandai 40 jigaic 10
2100210002 gaoshu 50 jigaic 5 gailvlun 45
2100210003 gaoshu 80 xiandai 20
2100210004 xiandai 70 jigaic 10 gailvlun 20
2100210005 gaoshu 50 xiandai 50
2100210001 2100210003 2100210005 2100210006
'''

# 解析数据:m、n、备选课程、学生选课信息、查询学生
input_s = input_s[1:-1].split('\n')
m, n = map(int, input_s[0].split()) # 提取课程数m和选课人数n。
classes = input_s[1:m+1] # 备选课程和课程容量。
classes = {k: int(v) for k,v in map(lambda x: x.split(), classes)} # 解析式生成备选课程字典。
students = map(lambda x: x.split(), input_s[m+1:m+n+1]) # 学生选课信息。
students = {int(i[0]): {k: int(v) for k,v in zip(*[iter(i[1:])]*2)} for i in students} # 字典解析式生成学生选课信息字典。
findall = list(map(int, input_s[-1].split())) # 查询学生。

# 问题分析:要查询学生选课,必先生成学生成功选课信息。我拟用{学号: [课程1,课程2]}字典形式组织数据,方便用学号查询。

# 根据选课规则生成学生成功选课信息字典。
choice_classes = {} # 初始化成功选课信息字典。

def class_sort(class_s):
    ''' 生成学生选课点数高低的列表 '''
    temp = [(k, v.get(class_s, 0)) for k,v in students.items()] # 解析学生选课点数。
    temp.sort(key=lambda x: x[1]) # 按选课点数排序。
    return [i for i in temp if i[1] != 0] # 剔除选课点数为0的记录。

for class_s,n in classes.items():
    lis = class_sort(class_s) # 获取学生选课点数列表。
    #print(class_s, lis) 
    for i in range(n): # 用pop()方法根据课程容量直接由高到低选取,选课点数相同,学号大的在后。

        if lis == []:
            break

        k,v = lis.pop()
        choice_classes[k] = choice_classes.get(k, []) + [class_s] # 列表记录成功选取课程。
    #input(choice_classes)
        

print(f"\n{' 学生选课 ':~^44}\n\n{choice_classes}\n\n") 
tem = sum(choice_classes.values(), [])

for c in classes:
    print(f"{'':>18}{c}: {tem.count(c)}")

# 输出
print(f"\n\n{' 输出 ':~^48}\n\n{', '.join(map(str, findall)):^50}\n\n{' 查询 ':~^48}\n\n")

for student in findall:
    temp = choice_classes.get(student)
    if temp:
        print(f"{'':>18}{', '.join(temp)}")
    else:
        print(f"{'':>18}{'None'}")
        

回页首

__上一篇:__ 算法实操:Python代码实现直插排序(含有序在前和有序在后)<\a>

__下一篇:__ 

我的HOT博:


推荐条件 点阅破千


回页首


老齐漫画头像

精品文章:

  • 好文力荐:齐伟书稿 《python 完全自学教程》 Free连载(已完稿并集结成书,还有PDF版本百度网盘永久分享,点击跳转免费🆓下载。)
  • OPP三大特性:封装中的property
  • 通过内置对象理解python'
  • 正则表达式
  • python中“*”的作用
  • Python 完全自学手册
  • 海象运算符
  • Python中的 `!=`与`is not`不同
  • 学习编程的正确方法

来源:老齐教室


回页首

◆ Python 入门指南【Python 3.6.3】


好文力荐:

  • 全栈领域优质创作者——寒佬(还是国内某高校学生)博文“非技术文—关于英语和如何正确的提问”,“英语”和“会提问”是学习的两大利器。

  • 【8大编程语言的适用领域】先别着急选语言学编程,先看它们能干嘛

  • 靠谱程序员的好习惯


CSDN实用技巧博文:

  • 8个好用到爆的Python实用技巧
  • python忽略警告
  • Python代码编写规范
  • Python的docstring规范(说明文档的规范写法)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/64692.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【Git 教程系列第 26 篇】Mac 升级系统到 Ventura 后,Git 公钥报 Permission denied 错误问题的解决方案

这是【Git 教程系列第 26 篇】&#xff0c;如果觉得有用的话&#xff0c;欢迎关注专栏。 注&#xff1a; 如果你是因为升级系统到 Ventura 后遇到的这个问题&#xff0c;可以直接看第三步的解决方案&#xff0c;前两步是我自己的写作习惯&#xff0c;只是记录一下这个过程&…

Qt OpenGL 图形字体的纹理映射

这次教程中&#xff0c;我们将在第14课的基础上创建带有纹理的字体&#xff0c;它真的很简单。也许你想知道如何才能给字体赋予纹理贴图&#xff1f;我们可以使用自动纹理坐标生成器&#xff0c;它会自动为字体上的每一个多边形生成纹理坐标。 这次课中我们还将使用Wingdings字…

BNext

又搬来了大神器啊 来自德国HassoPlattner计算机系统工程研究院的NianhuiGuo和HaojinYang等研究者提出了BNext模型&#xff0c;成为第一个在ImageNet数据集上top1分类准确率突破80%的BNN。 两年前&#xff0c;依靠早期 BNN 工作 XNOR-Net 起家的 XNOR.AI 被苹果公司收购&#…

redis基础5——redis的频道订阅和模式频道、redis主从复制、哨兵集群

文章目录一、发布订阅1.1 发布订阅过程1.2 发布订阅类型1.2.1 频道的发布订阅1.2.1.1 订阅频道* 实现原理1.2.1.2 发送消息* 实现原理1.2.1.3 退订频道* 实现原理1.2.2 模式的发布订阅1.2.2.1 订阅模式频道* 实现原理1.2.2.2 查询订阅与发布系统状态1.2.2.3 发送消息* 实现原理…

【c++基础】第三章 宏观部分:面向对象之类的层次结构与相互关系

第三章 宏观部分&#xff1a;面向对象之类的层次结构与相互关系关系has_a关系use_a关系&#xff08;友元关系&#xff09;is_a关系&#xff08;继承关系&#xff09;单继承多继承菱形继承多态&#xff08;polymorphic&#xff09;虚函数多态底层机制&#xff1a;虚函数、虚函数…

spring导入第三方资源

一、第三方资源配置管理 说明&#xff1a;以管理DataSource连接池对象为例讲解第三方资源配置管理 1 管理DataSource连接池对象 问题导入 配置数据库连接参数时&#xff0c;注入驱动类名是用driverClassName还是driver&#xff1f; 1.1 管理Druid连接池【重点】 数据库准备…

Android挂载系统分区执行mount和remount

第一种&#xff0c;通过adb挂载&#xff0c;需要root权限&#xff1b; adb root //adb 获取root权限&#xff1b; adb remount /system //从新挂载system目录或者说分区 第二种&#xff1a;通过Android下的Linux命令挂载&#xff0c;需要root权限&#xff1b; adb shell //…

【第八章 索引,索引结构,B-Tree,B+Tree,Hash,索引分类,聚集索引二级索引,索引语法】

第八章 索引&#xff0c;索引结构&#xff0c;B-Tree&#xff0c;BTree&#xff0c;Hash&#xff0c;索引分类&#xff0c;聚集索引&二级索引&#xff0c;索引语法 1.索引&#xff1a; ①索引&#xff08;index&#xff09;是帮助MySQL高效获取数据的数据结构(有序)。 ②特…

[附源码]Python计算机毕业设计Django社区人员信息管理系统设计与实现

项目运行 环境配置&#xff1a; Pychram社区版 python3.7.7 Mysql5.7 HBuilderXlist pipNavicat11Djangonodejs。 项目技术&#xff1a; django python Vue 等等组成&#xff0c;B/S模式 pychram管理等等。 环境需要 1.运行环境&#xff1a;最好是python3.7.7&#xff0c;…

Java学习笔记——StringBuilder

目录StringBuilder概述StringBuilder的构造方法StringBuilder常用的成员方法StringBuilder提高效率的原因String和StringBuilder之间的转换StringBuilder概述 StringBuilder是一个可变字符串类&#xff0c;我们可以把它看成一个容器。 作用&#xff1a;提高字符串的操作效率 …

HTML5期末作业:明星网站设计与实现——明星薛之谦介绍网页设计7个页面HTML+CSS+JavaScript

&#x1f389;精彩专栏推荐&#x1f447;&#x1f3fb;&#x1f447;&#x1f3fb;&#x1f447;&#x1f3fb; ✍️ 作者简介: 一个热爱把逻辑思维转变为代码的技术博主 &#x1f482; 作者主页: 【主页——&#x1f680;获取更多优质源码】 &#x1f393; web前端期末大作业…

一文叫你使用trace查看函数调用关系|分析Linux性能

抓取函数调用流程关系 抓取函数耗时 抓取代码片耗时 抓取函数里每个子函数时间戳 抓取事件信息 trace是内核自带的工具&#xff0c;相比于perf工具&#xff0c;trace只管抓trace数据并没有分析&#xff0c;perf在trace数据分析方面做出了很多成果。 但是我们现在就想看一下…

java生产者 消费者模式概念讲解

首先我们要了解生成者和消费者的基本概念 我们举个小例子 图里是一个奶箱 但里面并没有牛奶 我们想喝也没用 然后 送奶的工人送来了几瓶牛奶 然后工人会把牛奶放进奶箱 然后 把箱子给你锁上 然后你就可以去奶箱里拿奶来喝 这里 我们就可以比喻成 奶箱是一个存储数据的容器…

nginx安装与使用(入门)

目录 安装 入门 1. 什么是nginx 2. Nginx的作用 部署静态资源到ngnix 配置文件 部署外部资源到nginx 多个虚拟主机配置与域名映射 配置多个虚拟主机 配置反向代理 安装 win下 前往这里下载 nginx: download 如果启动后报错&#xff1a; nginx: [emerg] bind() to 0.0…

[附源码]Python计算机毕业设计Django甜品购物网站

项目运行 环境配置&#xff1a; Pychram社区版 python3.7.7 Mysql5.7 HBuilderXlist pipNavicat11Djangonodejs。 项目技术&#xff1a; django python Vue 等等组成&#xff0c;B/S模式 pychram管理等等。 环境需要 1.运行环境&#xff1a;最好是python3.7.7&#xff0c;…

【数据库与事务系列】分库分表中间件

前面讲了利用mybatis插件进行多数据源切换和分表的方案&#xff0c;但是对业务侵入性较强&#xff0c;当然给予mybatis-plus的对业务侵入性还好&#xff0c;但是支持的策略有限、场景有限。 所以业界诞生了很多分库分表中间件来专门解决这些问题。我们先来看看分库分表的背景。…

初始计算机网络——概念、组成、功能、分类

大一下学期学习计算机网络&#xff0c;但是那个时候很傻&#xff0c;不知道计算机网络的重要性&#xff0c;现在知道了只能回过头来补充知识&#xff0c;这个计算机网络真的很重要&#xff0c;也很后悔当时没有好好学 目录 一、计算机网络的概念 1.1 网络与计算机网络 1.2 计…

校园论坛(Java)—— 校园周边模块

校园论坛&#xff08;Java&#xff09;—— 校园周边模块 文章目录校园论坛&#xff08;Java&#xff09;—— 校园周边模块1、写在前面2、系统结构设计2.1 各个页面之间的调用关系2.2 校园周边页面设计3、校园周边模块设计3.1 校园周边主界面的实现3.2 增加附近的交通信息4. 总…

Vue v-model收集表单数据

Vue v-model收集表单数据1 单行文本2 多行文本3 复选框4 单选按钮5 选择器6 修饰符1 单行文本 对于输入框input&#xff0c;直接使用v-model绑定属性即可&#xff0c;该属性需要在data中定义。用法如下&#xff1a; <input v-model"content">var vm new Vue…

力扣 394. 字符串解码

题目 给定一个经过编码的字符串&#xff0c;返回它解码后的字符串。 编码规则为: k[encoded_string]&#xff0c;表示其中方括号内部的 encoded_string 正好重复 k 次。注意 k 保证为正整数。 你可以认为输入字符串总是有效的&#xff1b;输入字符串中没有额外的空格&#x…