自动筛选慕课作业班级未完成人员名单

背景:

  因为自己做助教,老师给发了一份从慕课中下载的随堂作业上交名单,让每个助教看看各自班级里面哪个人没有上交作业。

原因:

  为什么要用程序来筛选?因为你手中的班级学生名单可能是有序且有一定规则的,但是慕课上面学生的昵称是无序且无规则的,如果你人工去筛选,就需要一个个去核实,过程很繁琐。
如:
在这里插入图片描述
  于是,开始想怎么通过程序来进行筛选。

思路:

  可以肯定的是,无论慕课中学生昵称无论多么没有规则,他的昵称中肯定有他的名字,所以我就想到了Python中的match()和search()函数,这两个函数是字符串匹配的函数。
  两者的区别在于,match(s1,s2)函数从字符串s2的首个字符开始验证其和s1是否匹配,若首个字符即和s1的首字符不匹配,直接返回None;serach(s1,s2)函数却不一样,如果s2首字符和s1首字符不同,它会继续看s2的第二个字符和s1是否匹配,若遍历完全部s2都没有找到和s1匹配的字符串,才会返回None

  毫无疑问,我们要实现我们的筛选功能,要使用search()函数,这就将筛选问题转换为了一个正则匹配问题。
  其次,我们将原名单保存到数组original中,上交名单保存到数组verify中,这里读取原名单和上交名单我都是用的鼠标复制粘贴进输入框的,输入名单格式为[张三 王五 赵四],每个名字中间用一个空格隔开(一般从excel中复制粘贴到输入框内就不用调格式了)
  我们使用嵌套循环,第一个循环依次从原名单中选取名字,然后在上交名单的循环内查找,判断其是否和上交名单中的某一字符串匹配。通过事先设定一个变量m来判断原名单名字是否在上交名单中匹配到。我们默认原名单中所有名字在上交名单中都匹配不到,即m=1,在上交名单的循环中,若我们匹配到,我们将m更新为0,跳出循环,接着判断m的值,m=1说明没匹配到,那么我们就将这个人的名字存入res;如果不等于1,说明匹配到了,那就判断下一个名字。
  最后返回res数组即是未完成同学名单。

实验效果:

在这里插入图片描述

代码:

(这里是键盘输入符合我说的行分布输入情况,还有种情况是复制进输入框的字符会变成列分布,这个在下面还有代码)

按照行分布
#按行输入
import re
print("请输入班级总名单:")
original=[str(n) for n in input().split(' ')]
print('\n')

print("请输入需要上交名单:")
verify=[str(n) for n in input().split(' ')]

res=[]
for i in original:
    m=1
    for j in verify:
        if re.search(i,j)!=None:#找到
            m=0
    if m==1:res.append(i)
print('\n')    
print("班级未做人员名单:",res)
按照列分布的输入:

    这里因为都按照列分布了,本来输入应该是[张三 王五 赵六],结果变为了:[张三
                                   王五
                                   赵六]
这种情况我们就需要增加一个隔断符,让程序能够将原名单和待审核名单分开,这里我采用的是’***’,即我们先将原名单复制进输入框,然后加上隔断符,再将上交名单复制进来。即输入框内的输入为:[张三 王五 赵六 *** 电气张三 李四]。
我们对这个输入进行按行全部读入一个新数组a,然后我们遍历数组a,当遇到判断符’***'时,我们返回此时下标:i。利用i将数组a进行切分,original=a[:i] ,verify=a[i+1:](把判断符隔离出来)。
由于我对Python读取键盘输入还不熟,所以接下来的代码在网页:

http://www.dooccn.com/python3/

上可以生效,编译器就不行了,以后熟悉了Python的读取再来更改。

import re
import sys
a=[]
for line in sys.stdin:
    if line.strip() == '':
        break
    a.extend(line.split())

for i in range(len(a)):
    if a[i]=='***':
        break
        
original=a[:i]
verify=a[i+1:]

res=[]
for i in original:
    m=1
    for j in verify:
        if re.search(i,j)!=None:#找到
            m=0
    if m==1:res.append(i)
    
print(res)

进一步的解决方案

  Python直接读取两个excel文件,来进行筛选,这时就没有键盘输入不统一的情况发生了。但是这时我们要注意程序的时间复杂度问题,因为我用的是两个嵌套循环,所以若名单长分别为M、N,那么时间复杂度就是O(M*N)。
  这两个小问题等以后空闲了再处理,现在没那么多闲遐时间可以耗费。

猜你喜欢

转载自blog.csdn.net/weixin_43748296/article/details/88978634
今日推荐