python刷题第九周

第一题:

第6章-7 找出总分最高的学生 (15 分)
给定N个学生的基本信息,包括学号(由5个数字组成的字符串)、姓名(长度小于10的不包含空白字符的非空字符串)和3门课程的成绩([0,100]区间内的整数),要求输出总分最高学生的姓名、学号和总分。

输入格式: 输入在一行中给出正整数N(≤10)。随后N行,每行给出一位学生的信息,格式为“学号 姓名 成绩1 成绩2
成绩3”,中间以空格分隔。

输出格式: 在一行中输出总分最高学生的姓名、学号和总分,间隔一个空格。题目保证这样的学生是唯一的。

代码:

N = int(input())
t = []
score = []
rank = []
for i in range(N):
    s = input()
    t.append(s.split())
    score.append(int(t[i][2])+int(t[i][3])+int(t[i][4]))
    rank.append(score[i])
rank.sort()
x = score.index(rank[N-1])
print(t[x][1],t[x][0],score[x])

思考:

1.这道题比较困扰我的地方是:每个人的信息输入都是占一行的,以空格为分隔,我不太清楚如何处理。
2.在别人的代码里,他先通过s = input()将一行的信息输入,然后再通过s.split将一行的信息分割开来,放入t列表中存放。这样就实现了对以空格为间隔的一行数据的处理。

第二题:

第6章-8 输出全排列 (20 分) 输入整数n(3<=n<=7),编写程序输出1,2,…,n整数的全排列,按字典序输出。

输入格式: 一行输入正整数n。

输出格式: 按字典序输出1到n的全排列。每种排列占一行,数字间无空格。

别人的代码:

def f(x,s=""):
	s+=x
	if len(s)<n:
		for i in num:
			if i not in s:
				f(i,s)
	else:
		print(s)
n=int(input())
num=[str(i+1) for i in range(n)]
for i in num:
	f(i)

思考:

1.一开始我是从交换的角度思考,在看了别人的代码之后发现还可以通过增添的角度解决这个问题。
2.解析一下别人的代码:
首先通过num=[str(i+1) for i in range(n)]将1~n的数字以字符的形式存放在列表中,然后进行一个for循环。
整个过程类似于压栈,先是1进入,只要栈内的字符长度没有达到n,就进入下一个内层循环,循环内的判断条件是如果栈内没有i,那么i就入栈,继续递归,由于循环一直都是从1开始的,所以可以保证符合字典序。
第一个输出的自然是1234,接着,1的下一个数就是3了,然后就是1324、1342,函数的递归使得每一次的数字都不一样。

第三题

第7章-1 词频统计 (30 分) 请编写程序,对一段英文文本,统计其中所有不同单词的个数,以及词频最大的前10%的单词。

所谓“单词”,是指由不超过80个单词字符组成的连续字符串,但长度超过15的单词将只截取保留前15个单词字符。而合法的“单词字符”为大小写字母、数字和下划线,其它字符均认为是单词分隔符。

输入格式: 输入给出一段非空文本,最后以符号#结尾。输入保证存在至少10个不同的单词。

输出格式: 在第一行中输出文本中所有不同单词的个数。注意“单词”不区分英文大小写,例如“PAT”和“pat”被认为是同一个单词。

随后按照词频递减的顺序,按照词频:单词的格式输出词频最大的前10%的单词。若有并列,则按递增字典序输出。

别人的代码:

import sys
s=sys.stdin.read()
s=s[:s.find("#")]
#构建一个字符串中所有非数字、字母、下划线的字符的集合
t=set([i if i.isalnum()==False and i!='_' else " " for i in s ])
for i in t:
    #将字符串中所有非法字符替换为空格
    s=s.replace(i," ")
#所有字符转小写,并将字符串以空格为分割建立一个列表,每一项为一个小写单词
word=s.lower().split(" ")
dic={}
for i in word:
    #取长度为15的单词
    i=i[:15]
    dic[i]=dic.get(i,0)+1
#由于初始字符串中有多个连续空格,因此split()时会有空字符串存在,需要删除
del dic[""]
#排序,以词频为主要关键字,字典序为次要关键序,'-'表示降序
result=sorted(dic.items(),key=lambda x:(-x[1],x[0]))
print(len(result))
all=int(0.1*len(result))
for i in range(0,all):
    print(str(result[i][1])+":"+result[i][0])

收获:

1.首先最令我头疼的就是数据的输入,这里他利用了系统标准输入模块:sys.stdin.read(),成功将多行文字一次性读入。
然后通过s.find 函数找到含有“#”的一段,通过s=s[:s.find("#")]实现代码切片。
2.学习到了几个对字符串处理的函数,s.replace(i," "),将字符换为空格;word = s.lower()将字母全部变为小写

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值