*## python刷题
题目:第5章-7 列表去重 (40 分)
输入一个列表,去掉列表中重复的数字,按原来次序输出!
输入格式:
在一行中输入列表
输出格式:
在一行中输出不重复列表元素
输入样例:
在这里给出一组输入。例如:
[4,7,5,6,8,6,9,5]
输出样例:
在这里给出相应的输出。例如:
4 7 5 6 8 9
一、代码
n = eval(input())
print(*sorted(set(n),key=n.index))
二、心得
1.**eval(input)**函数用来执行一个字符串表达式,并返回表达式的值。
如:
n=81
eval("n + 4")
85
2.
sorted()
函数对所有可迭代的对象进行排序操作。
如:
a = [5,7,6,3,4,1,2]
b = sorted(a) # 保留原列表
>>> a
[5, 7, 6, 3, 4, 1, 2]
>>> b
[1, 2, 3, 4, 5, 6, 7]
题目:第5章-8 能被3,5和7整除的数的个数(用集合实现) (30 分)
求指定区间内能被3,5和7整除的数的个数
输入格式:
在一行中从键盘输入2个正整数a,b(1<=a<b<=10000000),用空格隔开。
输出格式:
在一行输出大于等于a且小于等于b的能被3,5和7整除的数的个数。
输入样例1:
在这里给出一组输入。例如:
10 100
输出样例1:
在这里给出相应的输出。例如:
0
输入样例2:
在这里给出一组输入。例如:
1000 100000
输出样例:
在这里给出相应的输出。例如:
943
一、代码
a,b=map(int,input().split())
count=0
for i in range(a,b+1):
if i%3==0 and i%5==0 and i%7==0:
count+=1
print(count)
二、心得
好像不用集合也能过,hhhh~
集合的话可以参考别人的代码,如下
m, n = input().split()
m, n = int(m), int(n)
set3 = set()
set5 = set()
set7 = set()
res_set = set()
for i in range(m, n + 1):
if (i % 3 == 0):
set3.add(i)
if (i % 5 == 0):
set5.add(i)
if (i % 7 == 0):
set7.add(i)
res_set = set3 & set5 & set7
print(len(res_set))
题目:第5章-9 求矩阵鞍点的个数 (30 分)
一个矩阵元素的“鞍点”是指该位置上的元素值在该行上最大、在该列上最小。
本题要求编写程序,求一个给定的n阶方阵的鞍点。
输入格式: 输入第一行给出一个正整数n(1≤n≤6)。随后n行,每行给出n个整数,其间以空格分隔。
输出格式: 鞍点的个数
输入样例1:
4
1 7 4 1
4 8 3 6
1 6 1 2
0 7 8 9
输出样例1:
1
输入样例2:
2
1 74 1
输出样例2:
0
输入样例3:
3
4 7 8
1 3 3
2 3 1
输出样例3:
2
一、代码
n = int(input())
list1 = []
sum = 0
for i in range(n):
s=input()
list1.append([i for i in s.split()])
print(list1)
for i in range(n):
for j in range(n):
if list1[i][j]==max(list1[i]):
for k in range(n):
if list1[i][j]>list1[k][j]:
break
else:
sum+=1
print(sum)
二、心得
1.
list1.append
函数是列表元素的插入
2.
s.split()****函数
通过指定分隔符对字符串进行切片
3.
max(list1[i])****函数
是列表自带的求最大值的函数
题目:第5章-10 两数之和 (30 分)
给定一组整数,还有一个目标数,在给定这组整数中找到两个数字,使其和为目标数,如找到,解是唯一的。找不到则显示 “no answer”。输出的下标按从小到大排序。用一重循环加字典实现。
输入格式:
在一行中给出这组数。 在下一行输入目标数
输出格式:
在一行中输出这两个数的下标,用一个空格分开。
输入样例1:
在这里给出一组输入。例如:
2,7,11,15
9
输出样例1:
在这里给出相应的输出。例如:
0 1
输入样例2:
在这里给出一组输入。例如:
3,6,9
10
输出样例2:
在这里给出相应的输出。例如:
no answer
一、代码
l=list(map(int,input().split(',')))
num=int(input())
d={}
for i in l:
d[i]=num-i
# print(d.items())
for key,value in d.items():
if key in l and value in l:
print(l.index(key),l.index(value))
break
else:
print('no answer')
二、心得
-
items()
函数以列表返回可遍历的(键, 值) 元组数组。
如:
d = {'one': 1, 'two': 2, 'three': 3}
for key,value in d.items():#当两个参数时
print(key + ':' + str(value))
输出:
one:1
two:2
three:3
题目:第5章-11 字典合并 (40 分)
输入用字符串表示两个字典,输出合并后的字典。字典的键用一个字母或数字表示。注意:1和‘1’是不同的关键字!
输入格式:
在第一行中输入第一个字典字符串;
在第二行中输入第二个字典字符串。
输出格式:
在一行中输出合并的字典,输出按字典序。
“1” 的 ASCII 码为 49,大于 1,排序时 1 在前,“1” 在后。其它的字符同理。
输入样例1:
在这里给出一组输入。例如:
{1:3,2:5}
{1:5,3:7}
输出样例1:
在这里给出相应的输出。例如:
{1:8,2:5,3:7}
输入样例2:
在这里给出一组输入。例如:
{“1”:3,1:4}
{“a”:5,“1”:6}
输出样例2:
在这里给出相应的输出。例如:
{1:4,“1”:9,“a”:5}
一、代码
a, b = eval(input()), eval(input())
c = [i for i in a.keys() if i in b.keys()]
for i in c:
b[i] = a[i] + b[i]
a.update(b) # 将b的键/值拷贝到a中
c = str(dict(sorted(a.items(), key=lambda x: x[0] if type(x[0]) == int else ord(x[0]))))
c = c.replace(' ', '')
c = c.replace("'", '"')
print(c)
二、心得
1.
sorted()
函数对所有可迭代的对象进行排序操作。
2.
a.update(b)
将b的键/值拷贝到a中。
3.
rod()函数
以一个字符(长度为1的字符串)作为参数,返回对应的 ASCII 数值。
4.
replace()
方法把字符串中的 old(旧字符串) 替换成 new(新字符串)
5.
items()
函数以列表返回可遍历的(键, 值) 元组数组。
题目:第6章-1 输入列表,求列表元素和(eval输入应用) (10 分)
在一行中输入列表,输出列表元素的和。
输入格式:
一行中输入列表。
输出格式:
在一行中输出列表元素的和。
输入样例:
[3,8,-5]
输出样例:
6
一、代码
print(sum(eval(input())))
二、心得
-
**eval()**函数使用需要熟悉掌握。
列表自带求和函数
sum函数
题目:第6章-2 一帮一 (15 分)
“一帮一学习小组”是中小学中常见的学习组织方式,老师把学习成绩靠前的学生跟学习成绩靠后的学生排在一组。本题就请你编写程序帮助老师自动完成这个分配工作,即在得到全班学生的排名后,在当前尚未分组的学生中,将名次最靠前的学生与名次最靠后的异性学生分为一组。
输入格式:
输入第一行给出正偶数N(≤50),即全班学生的人数。此后N行,按照名次从高到低的顺序给出每个学生的性别(0代表女生,1代表男生)和姓名(不超过8个英文字母的非空字符串),其间以1个空格分隔。这里保证本班男女比例是1:1,并且没有并列名次。
输出格式:
每行输出一组两个学生的姓名,其间以1个空格分隔。名次高的学生在前,名次低的学生在后。小组的输出顺序按照前面学生的名次从高到低排列。
输入样例:
8
0 Amy
1 Tom
1 Bill
0 Cindy
0 Maya
1 John
1 Jack
0 Linda
输出样例:
Amy Jack
Tom Linda
Bill Maya
Cindy John
一、代码
N=int(input())
man=[]
woman=[]
stu=[]
for i in range(N):
temp=input().split()
stu.append(temp[1])
if temp[0]=='1':
man.append(temp[1]) # 男生都存在man列表里
if temp[0]=='0':
woman.append(temp[1])# 女生都存在woman列表里
for j in range(len(man)):
if stu[j] in man:
print("{} {}".format(stu[j],woman[-1]))
del woman[-1] # 不断去掉最后一个
elif stu[j] in woman:
print("{} {}".format(stu[j],man[-1]))
del man[-1]
二、心得
-
append()
函数是列表的插入。 -
lst[-1]
: 表示最后的元素 -
det lst[n]
: 删除n位置的元素
题目:第6章-3 列表或元组的数字元素求和 (20 分)
求列表中数字和,列表中嵌套层次不限2层
输入格式:
在一行中输入列表或元组
输出格式:
在一行中输出数字的和
输入样例:
在这里给出一组输入。例如:
[11,2,[3,7],(68,-1),“123”,9]
输出样例:
在这里给出相应的输出。例如:
99
一、代码
lst = input()
# print(type(lst)) str类型
s = 0
# 去括号
lst = lst.replace('[','')
lst = lst.replace(']','')
lst = lst.replace('(','')
lst = lst.replace(')','')
lst = eval("[" + lst + "]")
for i in lst:
if type(i) != str:
s += int(i)
print(s)
二、心得
-
lst = lst.replace(’[’,’’)
是str自带的替换字符函数,将字符 ‘[’ 全部替换为 ‘,’
题目:第6章-4 列表数字元素加权和(1) (40 分)
输入一个嵌套列表,嵌套层次不限,根据层次,求列表元素的加权和。第一层每个元素 的值为:元素值
1,第二层每个元素的值为:元素值
2,第三层每个元素的值为:元素值*3, …,以此类推!
输入格式:
在一行中输入列表
输出格式:
在一行中输出加权和
输入样例:
在这里给出一组输入。例如:
[1,2,[3,4,[5,6],7],8]
输出样例:
在这里给出相应的输出。例如:
72
一、代码
def Right(l,n):
total = 0
if type(l) == type(1):
return n*l
else:
for i in l:
total = total + Right(i,n+1)
return total
l = eval(input())
print(Right(l,0))
二、心得
1.通过递归实现不断遍历
题目:第6章-5 列表元素个数的加权和(1) (40 分)
输入一个嵌套列表,嵌套层次不限,根据层次,求列表元素的加权个数和。第一层每个元素算一个元素,第二层每个元素算2个元素,第三层每个元素算3个元素,第四层每个元素算4个元素,…,以此类推!
输入格式:
在一行中输入一个列表。
输出格式:
在一行中输出加权元素个数值。
输入样例:
在这里给出一组输入。例如:
[1,2,[3,4,[5,6],7],8]
输出样例:
在这里给出相应的输出。例如:
15
一、代码
def Right(l,n):
total = 0
if type(l) == type(1):
return n
else:
for i in l:
total = total + Right(i,n+1)
return total
l = eval(input())
print(Right(l,0))
二、心得
1.递归实现
题目:第6章-6 求指定层的元素个数 (40 分)
输入一个嵌套列表,再输入层数,求该层的数字元素个数。
输入格式:
第一行输入列表 第二行输入层数
输出格式:
在一行中输出元素个数
输入样例:
在这里给出一组输入。例如:
[1,2,[3,4,[5,6],7],8]
3
输出样例:
在这里给出相应的输出。例如:
2
一、代码
a = input()
c = int(input())
num= 0
sum=0
for i in range(0,len(a)):
if(a[i]=='['):
num+=1
elif(a[i]==']'):
num-=1
if (c == num) and (a[i]!='[') and (a[i]!=']' and a[i]!=',' and a[i+1].isdigit()==False):
sum += 1
print(sum)
二、心得
1,
if (c == num)
判断是否到要求的层次
and (a[i]!=’[’) and (a[i]!=’]’ and a[i]!=’,’
判断是否不为数字
and a[i+1].isdigit()==False)
因为a为字符串类型,这个是判断数字是否存在连续现象
题目:第6章-7 找出总分最高的学生 (15 分)
给定N个学生的基本信息,包括学号(由5个数字组成的字符串)、姓名(长度小于10的不包含空白字符的非空字符串)和3门课程的成绩([0,100]区间内的整数),要求输出总分最高学生的姓名、学号和总分。
输入格式:
输入在一行中给出正整数N(≤10)。随后N行,每行给出一位学生的信息,格式为“学号 姓名 成绩1 成绩2 成绩3”,中间以空格分隔。
输出格式:
在一行中输出总分最高学生的姓名、学号和总分,间隔一个空格。题目保证这样的学生是唯一的。
输入样例:
5
00001 huanglan 78 83 75
00002 wanghai 76 80 77
00003 shenqiang 87 83 76
10001 zhangfeng 92 88 78
21987 zhangmeng 80 82 75
输出样例:
zhangfeng 10001 258
一、代码
n = int(input())
s = [input().split() for i in range(n)]
# print(type(s))
maxSum = [int(s[i][2]) + int(s[i][3]) + int(s[i][4]) for i in range(n)]
big = maxSum.index(max(maxSum)) # 找到maxSum列表中最大的成绩的下标
print(s[big][1],s[big][0],maxSum[big])
二、心得
熟悉列表的内置函数
-
max(列表1)
找最大元素 -
列表1.index(a)
找到列表1中的a元素对应的下标
题目:第6章-8 输出全排列 (20 分)
输入整数n(3<=n<=7),编写程序输出1,2,…,n整数的全排列,按字典序输出。
输入格式:
一行输入正整数n。
输出格式:
按字典序输出1到n的全排列。每种排列占一行,数字间无空格。
输入样例:
在这里给出一组输入。例如:
3
输出样例:
在这里给出相应的输出。例如:
123
132
213
231
312
321
一、代码
import random
import math
n = int(input())
t = []
s = set()
for i in range(1, n + 1):
t.append(str(i))
all=math.factorial(n) # n个数字有n!种排列
while len(s) < all:
random.shuffle(t) # 每次都打乱
s.add("".join(t)) # 拼成字符串,加到s容器
s = sorted(s) # 按照字典序排列
# print(type(s))
for i in s:
print(i)
二、心得
1.
set 容器
可以自动除去相同元素
2.
sorted()
函数可以对元素进行排序
如:
s=set()
n=input().split()
for i in n:
s.add(i)
print(s)
s=[int(i) for i in s]
print(*sorted(s)) # '*' 可以去掉 '[' ']' ','
输出:
4 1 3 6 21 2 4 1
{'21', '6', '1', '4', '2', '3'}
1 2 3 4 6 21
- **math.factorial(n)**函数是求n的阶乘
-
**random.shuffle(t)**函数将序列的所有元素随机排序。
如:
list=[2,5,1,7,3]
for i in range(3):
random.shuffle(list)
print(list)
输出:
[1, 5, 3, 7, 2]
[7, 5, 2, 1, 3]
[5, 1, 7, 2, 3]
题目:第7章-1 词频统计 (30 分)
请编写程序,对一段英文文本,统计其中所有不同单词的个数,以及词频最大的前10%的单词。
所谓“单词”,是指由不超过80个单词字符组成的连续字符串,但长度超过15的单词将只截取保留前15个单词字符。而合法的“单词字符”为大小写字母、数字和下划线,其它字符均认为是单词分隔符。
输入格式:
输入给出一段非空文本,最后以符号#结尾。输入保证存在至少10个不同的单词。
输出格式:
在第一行中输出文本中所有不同单词的个数。注意“单词”不区分英文大小写,例如“PAT”和“pat”被认为是同一个单词。
随后按照词频递减的顺序,按照词频:单词的格式输出词频最大的前10%的单词。若有并列,则按递增字典序输出。
输入样例:
This is a test.
The word “this” is the word with the highest frequency.
Longlonglonglongword should be cut off, so is considered as the same as longlonglonglonee. But this_8 is different than this, and this,and this…# this line should be ignored.
输出样例:(注意:虽然单词the也出现了4次,但因为我们只要输出前10%(即23个单词中的前2个)单词,而按照字母序,the排第3位,所以不输出。)
23
5:this
4:is
一、代码
# 导入库
import re
import collections
import sys
words = "".join([line for line in sys.stdin]) # 标准输入sys.stdin读入文本
words = re.compile(r"\w+", re.I).findall(words.lower().split('#')[0]) # 正则表达式将文本处理成全小写并读到符号#
words = [each.strip() for each in words] # 去除空格
words = list(map(lambda each: each[0:15] if len(each) > 15 else each, words)) # 长度超过15的单词将只截取保留前15个单词字符
counter = collections.Counter(words) # 使用Counter统计词频
rank = sorted(counter.items(), key=lambda each: (-each[1], each[0]), reverse=False) # 按照词频递减排序
print(len(rank)) # 输出不同单词的个数
for each in rank[0:int(0.1*len(rank))]: # 输出词频最大的前10%的单词
print("{}:{}".format(each[1], each[0]))
二、心得
有点困难,先暂时参考…