目录
一、选择题
二、填空题
三、编程题
1.通过两个列表构建字典
2.足球联赛排名
3.使用字符串的索引和切片知识输入月份数字,输出英文月份缩写
4.jmu-Java&Python-统计文字中的单词数量并按出现次数排序
5.jmu-python-随机生成密码
6.jmu-python-重复元素判定
7.jmu-python-生日悖论
8.列表或元组的数字元素求和
9.列表数字元素加权和(1)
10.列表数字元素加权和(2)
11.列表元素个数的加权和(1)
12.列表元素的个数加权和(2)
13.求指定层的元素个数
14.溢出控制
15.缩写期刊名
16.多项式相加
17.字典合并与排序
18.解析车间里的阀门状态
19.jmu-python-九九乘法表(矩形)
20. jmu_python_最大公约数&最小公倍数
21.jmu-python-凯撒密码加密算法
22.输出全排列
23.打印特殊三角形
24.班级排队
25.漂亮的螺旋
26.兔子跳楼梯
27.模拟报数游戏(约瑟夫环问题)
28.就区间正整数内所有素数之和
29.输出<=n的全部回文数
30.列表生成及循环左移
31.奖金计算,循环与多分支
32.字典的应用-找出出现次数最多的字符串
33.统计输入字符串中的单词个数及单词的平均长度
34. 对于给定的正整数N,求它的位数及其各位数字之和
35.求输入数字的平方,如果平方运算后小于50则退出
1.A
运行题目代码可知
2.A
条件number%2 and not number%3
当number%2 与not number%3都不为0为真。表示number是可以被3整除的奇数。
3.B
由循环退出的条件可知:当number为合数的时候会中途退出,isPrime的值会变为False,i为number的第一个不为1的因数。若number为质数,isPrime的值为True,i为number-1。
4.C
A:输出为0,1,2([0,3)的左闭右开区间)
B:输出为1,2([0,2)的左闭右开区间,再加一)
D:输出为2,3([1,3)的左闭右开区间,再加一)
5.D
A:循环变量的取值在一开始就生成了,并生成了一个生成器[0,1,2],循环变量就依次取值,循环体中可以临时改变循环变量的值,但不会改变生成器。
6.B
range(3,6)为[3,6)的左闭右开区间,最大为5。
7.A
range(3,0,-1)表示从3到0,步长为-1的左闭右开区间,即3,2,1。
8.B
由于k为3 的倍数,减3依旧是3的倍数,所以会执行无限次。、
9.B
range(start, stop[, step])
A:可以有3个参数
B:阐述没有加冒号的用法
C:起始值默认为0,步长默认为1
D:ord函数将字符串转成ascll码值,且ord('z')比ord('a')大。
若起始值比结束值大,需要加上步长。
10.B
最后一次循环,i为5,range(1,i+1)为[1,6),要输出5次,即5个G。
print(*objects, sep=' ', end='\n', file=sys.stdout, flush=False)
11.A
判断条件位置的不同会影响结果。i%2==0的条件在后面,所以会先执行i=2时的结果再退出程序;j%2==0的条件在前面,当j=2时会直接退出。所以i最大可为2,j最大为1。故i*j的结果为1,2。
12.B
可以看出,此题的意思是若num没有大于1的因数,即为质数,则输出“嘻嘻”;否者,有几个小于自身且大于1的因数,输出几个“哈哈”。
13.D
当i为2时,跳过此次循环,但是i不能实现自增(因为跳过了),却满足i<10的循环条件,就会一直循环下去。
14.A
15.C
i没有限制,j的判断语句在后面,所以i最大为3,j最大为2。i*j的结果为1,2,2,4,3,6
1.D,G,H
2.D,B,H
3.A,H,I
4.40
5.1,3,5
6.(1)4,40 (2)12 (3)6
s=input().split()
l=input().split()
x=dict(zip(s,l))
x=list(x.items())
x.sort()
print(x)
需要用items函数将字典中元素连接起来,否则排序会默认只留下前面那个元素(即键)
import math
t=int(input())
for l in range(t):
n=int(input())
score=[i*0 for i in range(n)]#比赛得分
success=[i*0 for i in range(n)]#净进球数
goal = [i * 0 for i in range(n)]#总进球数
for k in range(int(n*(n-1)/2)):
i,j,p,q=map(int,input().split())
#计算比赛得分
if p>q:
score[i-1]+=3
success[i - 1] += math.fabs(p - q)
success[j - 1] -= math.fabs(p - q)
elif p==q:
score[i-1]+=1
score[j-1]+=1
else:
score[j-1]+=3
success[i - 1] -= math.fabs(p - q)
success[j - 1] += math.fabs(p - q)
goal[i - 1] += p
goal[j - 1] += q
#队伍排名的列表
rank=[]
while 1:
#元素个数等于n退出
if len(rank)==n:
break
#求当前得分最高队伍
k=0
for i in range(0,n):
#排名列表有就跳过
if i in rank:
continue
if k == 0:
max = i
#得分高
if score[i]>score[max]:
max=i
#得分一样
elif score[i]==score[max]:
#净进球数高
if success[i]>success[max]:
max=i
#净进球数一样
elif success[i]==success[max]:
#总进球数高
if goal[i] >goal[max]:
max=i
k += 1
rank.append(max)
if len(rank)!=n:
print(max+1,end=' ')
else:
print(max+1)
由于p-q为负时会被当成0,所以直接操作p-q的绝对值。使用了math的fabs函数。
month=int(input())
if month==1:
print('Jan')
elif month==2:
print('Feb')
elif month==3:
print('Mar')
elif month == 4:
print('Apr')
elif month == 5:
print('May')
elif month==6:
print('Jun')
elif month==7:
print('Jul')
elif month == 8:
print('Aug')
elif month == 9:
print('Sep')
elif month==10:
print('Oct')
elif month==11:
print('Nov')
elif month ==12:
print('Dec')
import sys
#多行输入lines为列表,元素是每行字符
lines=sys.stdin.readlines()
#整合为s一个字符串
s=''
for i in lines:
s+=i
#元素转为小写
s=s.lower()
#将不是字母的字符转成空格,存在字符串lines中
lines=''
error=['!','.',',',':','*','?']
for i in s:
if i in error:
lines+=' '
else:
lines+=i
#字符串切片,去掉空格
lines=lines.split()
#与lines等长的元素为0的列表
ziro=[0 for i in lines]
#每个单词个数的字典,初始值为0
dic=dict(zip(lines,ziro))
#输出单词个数
print(len(dic))
#记录每个单词出现个数
for i in lines:
dic[i]+=1
#对字典的值排序(降序)
dic=sorted(dic.items(), key=lambda d: d[0], reverse=False)
#转回字典格式
dic=dict(dic)
#对字典的关键字排序(升序)
dic=sorted(dic.items(), key=lambda d: d[1], reverse=True)
x=0
for i in dic:
#输出10个就退出
if x==10:
break
s,t=i
print(s+'='+str(t))
x+=1
陷阱:连接符‘-’是不能被变成空格的。
多行输入sys.stdin.readline()函数:
需要调用sys库,sys.stdin是一个标准化输入的方法,其中默认输入的格式是字符串,如果是int,float类型则需要强制转换。读入值为一个列表,每行字符为一个元素(包括\n)。
排序函数:
list.sort(cmp=None, key=None, reverse=False)
列表特有。
sorted(iterable, cmp=None, key=None, reverse=False)
- iterable -- 可迭代对象。
- cmp -- 比较的函数,这个具有两个参数,参数的值都是从可迭代对象中取出,此函数必须遵守的规则为,大于则返回1,小于则返回-1,等于则返回0。
- key -- 主要是用来进行比较的元素,只有一个参数,具体的函数的参数就是取自于可迭代对象中,指定可迭代对象中的一个元素来进行排序。
- reverse -- 排序规则,reverse = True 降序 , reverse = False 升序(默认)。
lambda函数:
- 将lambda函数赋值给一个变量,通过这个变量间接调用该lambda函数。
add = lambda x, y: x+y
add(x,y)=x+y
- 将lambda函数赋值给其他函数,从而将其他函数用该lambda函数替换。
- 将lambda函数作为参数传递给其他函数。
items函数:
items() 函数以列表返回可遍历的(键, 值) 元组。
将字典中的键值对以元组存储,并将众多元组存在列表中。
方法一:
import random
import string
import random
x=int(input())
n=int(input())
m=int(input())
lines=string.ascii_letters+string.digits
l=len(lines)
random.seed(x)
for i in range(n):
for j in range(m):
a=random.randint(0,l-1)
b=lines[a]
if j==m-1:
print(b)
else:
print(b,end='')
方法二:
import random
import string
import random
x=int(input())
n=int(input())
m=int(input())
lines=string.ascii_letters+string.digits
l=len(lines)
random.seed(x)
for i in range(n):
for j in range(m):
a=random.choice(lines)
if j==m-1:
print(a)
else:
print(a,end='')
String模块中的常量:
string.digits:数字0~9
string.ascii_letters:所有字母(大小写)
string.ascii_lowercase:所有小写字母
string.printable:可打印字符的字符串
string.punctuation:所有标点
string.ascii_uppercase:所有大写字母
seed函数:
我们调用 random.random() 生成随机数时,每一次生成的数都是随机的。但是,当我们预先使用 random.seed(x) 设定好种子之后,其中的 x 可以是任意数字,如10,这个时候,先调用它的情况下,使用 random() 生成的随机数将会是同一个。需要从random库中调用。
详解Python seed()
randint函数:
randint(a,b)返回一个在区间[a,b]上的随机数。
choice函数:
choice(seq)随机返回序列seq中的一个元素。如果 seq 为空,则引发 IndexError。
详解Python中random库 - random的用法
n=int(input())
yes=0
no=0
for i in range(n):
line=input().split()
check=set(line)
if len(line)==len(check):
no+=1
else:
yes+=1
print('True={}, False={}'.format(yes,no))
运用集合去重,判断列表元素和集合元素个数是否相等判断是否重复。
import random
x,n=map(int,input().split())
yes=0
random.seed(x)
for i in range(n):
test = []
for j in range(23):
test.append(random.randint(1,365))
ans=set(test)
if len(test)>len(ans):
yes+=1
print('rate={:.2f}'.format(yes/n))
def Sum(x):
sums = 0
for ch in x:
if isinstance(ch, int):
sums += ch
if isinstance(ch, list):
sums += Sum(ch)
if isinstance(ch, tuple):
sums += Sum(ch)
return sums
x=eval(input())
print(Sum(x))
isinstance() 函数:
判断一个对象是否是一个已知的类型,类似 type()。
isinstance(object, classinfo)
>>>a = 2
>>> isinstance (a,int)
True
>>> isinstance (a,str)
False
>>> isinstance (a,(str,int,list)) # 是元组中的一个返回 True
True
isinstance() 与 type() 区别:
type() 不会认为子类是一种父类类型,不考虑继承关系。
isinstance() 会认为子类是一种父类类型,考虑继承关系。
如果要判断两个类型是否相同推荐使用 isinstance()。
def Sum(x,n):
sums = 0
for ch in x:
if isinstance(ch, int):
sums += ch*n
if isinstance(ch, list):
sums += Sum(ch,n+1)
return sums
x=eval(input())
n=1
y=Sum(x,n)
print(y)
加权,递归时需要增加权重这一参数。
def Sum(x,n):
sums = 0
for ch in x:
if isinstance(ch, int):
sums += ch*n*pow(-1,n-1)
if isinstance(ch, list) :
sums += Sum(ch,n+1)
return sums
x=eval(input())
n=1
y=Sum(x,n)
print(y)
def Sum(x,n):
sums = 0
for ch in x:
if isinstance(ch, int):
sums += n
if isinstance(ch, list) :
sums += Sum(ch,n+1)
return sums
x=eval(input())
n=1
y=Sum(x,n)
print(y)
def Sum(x,n):
sums = 0
for ch in x:
if isinstance(ch, int):
sums += n
if isinstance(ch, list) :
sums += Sum(ch,n-1)
return sums
x=eval(input())
n=10
y=Sum(x,n)
print(y)
x=eval(input())
n=int(input())
def Sum(x,n,m):
ans=0
for i in x:
if isinstance(i,list) and m
while True:
try:
n=int(input())
print(int(pow(2,8*n-1)-1))
except:
break
t=int(input())
for i in range(t):
x=input()
x=x.lower()
line=x.split()
l=len(line)
for j in line:
if len(j)>4:
s=[p for p in j]
for k in range(4):
print(j[k],end='')
print('.',end='')
if len(j)<=4:
print(j,end='')
if l>1:
print(' ',end='')
else:
print()
l-=1
split()函数的str不能为''(空)。
F1=input().split(',')
F2=input().split(',')
n=int(input())
f1=[]
f2=[]
ans=0
for i in F1:
tup=tuple(map(int,i.split()))
f1.append(tup)
if n==tup[1]:
ans+=tup[0]
for i in F2:
tup = tuple(map(int, i.split()))
f2.append(tup)
if n==tup[1]:
ans+=tup[0]
print(ans)
既然是问某个特定的项,就不合并了。嘿嘿(*^▽^*)
a=eval(input())
b=eval(input())
for i in b:
if i in a:
a[i]+=b[i]
else:
a[i]=b[i]
a=sorted(a.items(),key=lambda b:b[0],reverse=False)
a=dict(a)
print(a)
自定义排序,见题5。
x=eval(input())
x=x.hex()
x=int(x,16)
ans=[]
for i in range(8):
if x%2==0:
ans.append(False)
else:
ans.append(True)
x//=2
print(ans)
bytes 函数返回一个新的 bytes 对象,该对象是一个 0 <= x < 256 区间内的整数不可变序列。它是 bytearray 的不可变版本。
class bytes([source[, encoding[, errors]]])参数
- 如果 source 为整数,则返回一个长度为 source 的初始化数组;
- 如果 source 为字符串,则按照指定的 encoding 将字符串转换为字节序列;
- 如果 source 为可迭代类型,则元素必须为[0 ,255] 中的整数;
- 如果 source 为与 buffer 接口一致的对象,则此对象也可以被用于初始化 bytearray。
- 如果没有输入任何参数,默认就是初始化数组为0个元素。
返回值
- 返回一个新的 bytes 对象。
实例
>>>a = bytes([1,2,3,4])
>>> a
b'\x01\x02\x03\x04'
>>> type(a)
>>>
>>> a = bytes('hello','ascii')#用ascii码来编
>>>
>>> a
b'hello'
>>> type(a)
>>>
bytes十六进制的表达还原:
x.hex() #调用bytes的hex函数
'090d0a4142'
python中各进制的表示及其转换
for i in range(1,10):
for j in range(1,10):
if j<9:
print('{}*{}={:<4d}'.format(i,j,i*j),end='')
else:
print('{}*{}={:<4d}'.format(i, j, i * j))
python 格式化输出详解(占位符:%、format、f表达式)——上篇 理论篇
a,b=map(int,input().split(','))
c=a*b
while a>0 and b>0:
a,b=b,a%b
a=max(a,b)
print('GCD:{}, LCM:{}'.format(a,int(c/a)))
辗转相除法:
辗转相除法又叫欧几里得算法,是欧几里得最先提出来的.辗转相除法的实现,是基于下面的原理(在这里用(a,b)表示a和b的最大公因数):
(a,b)=(a,ka+b),其中a、b、k都为自然数.………………①
也就是说,两个数的最大公约数,将其中一个数加到另一个数上,得到的新数,其公约数不变,比如(4,6)=(4+6,6)=(4,6+2×4)=2.要证明这个原理很容易:如果p是a和ka+b的公约数,p整除a,也能整除ka+b.那么就必定要整除b,所以p又是a和b的公约数,从而证明他们的最大公约数也是相等的.
基于上面的原理,就能实现我们的迭代相减法:
(78,14)=(64,14)=(50,14)=(36,14)=(22,14)=(8,14)=(8,6)=(2,6)=(2,4)=(2,2)=(0,2)=2
基本上思路就是大数减去小数,一直减到能算出来为止,在作为练习的时候,往往进行到某一步就已经可以看出得值.迭代相减法简单,不过步数比较多,实际上我们可以看到,在上面的过程中,由(78,14)到(8,14)完全可以一步到位,因为(78,14)=(14×5+8,14)=(8,14),由此就诞生出我们的辗转相除法.
用辗转相除法求(a,b).设r0=b,r1=a,反复运用除法算式,得到一系列整数qi,ri和下面的方程:
相当于每一步都运用原理①把数字进行缩小,上面右边就是每一步对应的缩小结果,可以看出,最后的余数rn就是a和b的公约数.迭代相减法和辗转相除法在本质上是一样的,相对来说,减法比较简单(需要10步),但是除法步数少(仅需4步)。
import string
x=input()
n=int(input())
y=''
n=n%26
x1=string.ascii_lowercase
x2=string.ascii_uppercase
for i in x:
if i in x1:
j=(ord(i)-ord('a')+n)%26+ord('a')
y+=chr(j)
elif i in x2:
j = (ord(i) - ord('A') + n) % 26 + ord('A')
y += chr(j)
else:
y+=i
print(y)
from itertools import permutations
n=int(input())
a=list(range(1,n+1))
for j in permutations(a,n):
print(''.join("%d"%i for i in j))
Permutations(iterator, r)Itertools.permutation()功能属于组合发电机。用于简化组合结构(例如排列,组合和笛卡尔积)的递归生成器称为组合迭代器。
如单词“Permutation”所理解的,它指的是可以对集合或字符串进行排序或排列的所有可能的组合。同样在这里itertool.permutations()方法为我们提供了迭代器可能存在的所有可能的安排,并且所有元素均根据该位置而不是根据其值或类别被假定为唯一。所有这些排列都是按字典顺序提供的。功能itertool.permutations()接受一个迭代器和“ r”(需要排列的长度)作为输入,并假设“ r”作为迭代器的默认长度(如果未提及),并分别返回所有可能的长度为“ r”的排列。
python——permutations()函数
n=int(input())
p=list(range(1,n+1))
for i in range(1,n+1):
x=[]
a=i
for j in range(n,i-1,-1):
if j!=n:
a+=p[j]
x.append(a)
if j>i:
if a<10:
print(a,end=' ')
else:
print(a,end=' ')
else:
print(a)
注意,每行末尾不能有空格,前面小于10的数字占两格长度。
n=int(input())
high=list(map(int,input().split()))
sex=list(map(int,input().split()))
boy=[]
girl=[]
for i in range(n):
if sex[i]==0:
boy.append(high[i])
else:
girl.append(high[i])
boy=sorted(boy,reverse=False)
girl=sorted(girl,reverse=False)
girl.extend(boy)
for i in girl:
print(i,end=' ')
列表插入:
append():从后面直接插入
extend():拆分成元素从后面插入
insert(index,object):在insert处插入object
n=int(input())
x=[[0]*n for i in range(n)]
lastx=n-1
lasty=n-1
f=1
num=n*n
x[lastx][lasty]=num
#左上右下1,2,3,4
while num>-n**2:
if f==1:
if lasty-1>=0 and x[lastx][lasty-1]==0:
x[lastx][lasty-1]=x[lastx][lasty]-1
lasty-=1
else:
f=2
elif f==2:
if lastx-1>=0 and x[lastx-1][lasty]==0:
x[lastx-1][lasty]=x[lastx][lasty]-1
lastx-=1
else:
f=3
elif f==3:
if lasty+1<=n-1 and x[lastx][lasty+1]==0:
x[lastx][lasty+1]=x[lastx][lasty]-1
lasty+=1
else:
f=4
else:
if lastx+1<=n-1 and x[lastx+1][lasty]==0:
x[lastx+1][lasty]=x[lastx][lasty]-1
lastx+=1
else:
f=1
num-=1
for i in range(n):
for j in range(n):
if j
先生成一个二维矩阵,每个元素初始化为0。从最后一个元素开始循环,逆着螺旋方向,也就是左下右上的顺序进行,分别对应f的1,2,3,4。当下一个值不为0或者到了矩阵的边界时,就算到达了边界,需要改变方向,也就是f的值。
n=int(input())
if n <= 2:
print(n)
else:
temp_list = [0, 1, 2]
for i in range(3, n + 1):
temp_list.append(temp_list[-1] + temp_list[-2])
print(temp_list[-1])
动态规划问题:
dp(n)=dp(n-1)+dp(n-2)
x=int(input())
y=int(input())
queue=[i+1 for i in range(x)]
p=y-1
while len(queue)>1:
p%=len(queue)
queue.pop(p)
p+=y-1
print(queue)
import math
a,b=map(int,input().split())
if a>b:
a,b=b,a
s=0
for i in range(a,b+1):
leap=0
for j in range(2,int(math.sqrt(i))+1):
if i%j==0:
leap=1
break
if leap==0:
s+=i
if a==1:
s-=1
if s>0:
print(s)
else:
print('not have prime!')
import copy
x=int(input())
for i in range(x+1):
z=str(i)
y=copy.deepcopy(z)
y=y[::-1]
if y==z:
print(i)
n=int(input())
x=[i+1 for i in range(n)]
x.remove(1)
x.append(1)
print(x)
p=eval(input())
s=0
if p>1000000:
s+=(p-1000000)*0.01
p=1000000
if p>600000:
s+=(p-600000)*0.015
p=600000
if p>400000:
s+=(p-400000)*0.03
p=400000
if p>200000:
s+=(p-200000)*0.05
p=200000
if p>100000:
s+=(p-100000)*0.075
p=100000
s+=p*0.1
print('%.2f'%(s))
import sys
import copy
x=sys.stdin.readlines()
y=''
for i in x:
y+=str(i)
y=y.split()
y.pop()
x=copy.deepcopy(y)
y=set(y)
ziro=[0 for i in y]
z=dict(zip(y,ziro))
for i in x:
if i in z:
z[i]+=1
z=sorted(z.items(),key=lambda b:b[1],reverse=True)
print(z[0][0],z[0][1])
s=input()
sum=0
for i in range(len(s)):
if s[i].isalpha():
sum+=1
ans=len(s.split())
sum/=ans
print('{},{:.2f}'.format(ans,sum))
N=int(input())
ans=0
sum=0
while N:
sum+=N%10
N//=10
ans+=1
print(ans,sum)
x=float(input())
while True:
print('{}'.format(x**2))
if x**2<50:
break
x=float(input())
要用float,用eval会答案错误。