目录
-
python速查卡
-
实验题回顾
输入
常见
n=int(input()) #最普遍 int可换成其他数据类型 适用于单行单个输入
a,b=input().split() #适用于单行多个
a,b=input().split(',') # ‘’内可替换为其他符号
n=list(map(int,input().split())) #单行多个 int处可转换为其他数据类型
for i in int(input()): #适用于多行输入
n=int(input())
for i in range(n): #可指定输入n行
m=input()
n=eval(input()) #可识别输入的类型
输出
常见
print('Hello world') #最普遍的单行输出
print() #换行
print('hello',end=' ') #不换行输出
print('world',end=' ')
print('{}'.format(n)) #最常用的format输出,可变换多种形式
print('{:.2f}'.format(n)) #保留两位小数
print(' '.join(lst)) #间隔输出列表lst中的内容,注意列表lst中的值要为str类型
正则化输出
提醒
- 计算小数记得把类型转换成float
- 查找字符可用index方法
n=input()
m=input()
t=len(m)
m=m[::-1]
s=m.index(n)
print('index','=',t-s-1)
-
数字进制转换
打印时不输出前缀可以使用 print(s[2:])
例题如下
def count(x, y):
a = bin(x)[2:]
b = bin(y)[2:]
len1 = max(len(a), len(b))
a = a.zfill(len1)
b = b.zfill(len1)
d = 0
for i in range(len1):
if a[i] != b[i]:
d += 1
return d
def total(n):
t = 0
for i in range(len(n)):
for j in range(i+1, len(n)):
t += count(n[i], n[j])
return t
n=input().split()
lst=[]
for i in n:
lst.append(int(i))
print(total(lst))
-
复数
- 虚数不能单独存在,它们总是和一个值为 0.0 的实数部分一起构成一个复数
- 复数由实数部分和虚数部分构成
- 表示虚数的语法:real+imagej
- 实数部分和虚数部分都是浮点数
- 虚数部分必须有后缀j或J
a,b,c=map(complex,input().split())
m=a+b+c
n=a*b*c
m1=int(m.real)
n1=int(n.real)
m2=int(m.imag)
n2=int(n.imag)
print("{}{:+d}i".format(m1,m2))
print("{}{:+d}i".format(n1,n2))
- 对数字的操作有时候转换成字符串会简单一点,并合理运用切片功能
-
chr()和ord()函数
- ord()函数就是用来返回单个字符的ascii值(0-255)或者unicode数值()
- 相反地,chr()函数是输入一个整数【0,255】返回其对应的ascii符号
- 数字判断也可使用,即判断其ASCII码范围
n=str(input())
print(ord('0') <= ord(n[0]) <= ord('9') and ord('0') <= ord(n[1]) <= ord('9') and ord('0') <= ord(n[2]) <= ord('9'))
-
判断回文字符
a=input()
print(a)
print(a[::-1]==a)
判断三角形,尤其注意顺序
a=float(input())
b=float(input())
c=float(input())
if a+b>c and a+c>b and b+c>a:
if a==b==c:
print('等边三角形')
elif a==b or b==c or a==c:
if a*1.414==b==c*1.414 or a*1.414==c==b*1.414 or b*1.414==a==c*1.414:
print('等腰直角三角形')
else:
print('等腰三角形')
else:
print('普通三角形')
else:
print('非三角形')
- 计算两时间的差值,注意输出时的补零操作
a1,a2,a3=input().split(':')
b1,b2,b3=input().split(':')
a1,a2,a3,b1,b2,b3=int(a1),int(a2),int(a3),int(b1),int(b2),int(b3),
if a3>=b3:
c3=a3-b3
else:
c3=a3-b3+60
a2=a2-1
if a2>=b2:
c2=a2-b2
else:
c2=a2-b2+60
a1=a1-1
c1=a1-b1
print('{:0>2}:{:0>2}:{:0>2}'.format(c1,c2,c3))
-
最大公约数和最小公倍数
- 求两个给定正整数的最大公约数和最小公倍数。
- 求m, n的最大公约数可以用辗转相除法,描述如下:A.取m做除数,n做被除数 B.用m除n,如果余数为0,则n为这两个数的最大公约数,结束。C.如果余数不为0,令m = n, n 等于上一步计算出的余数,回到B
- 最小公倍数等于两数乘积除以最大公约数
m,n=input().split()
m,n,a,b=int(m),int(n),int(m),int(n)
if m>=n:
while m%n!=0:
c=m%n
m=n
n=c
else:
print(c,a*b//c)
else:
while n%m!=0:
c=n%m
n=m
m=c
else:
print(c,a*b//c)
-
判断素数(质数)
与之相反的是合数 !!!重要内容
if num%2 == 0:
continue
for i in range(3,num):
if num%i == 0:
break
else:
print(num,'是质数')
或
def isPrime(num):
if num == 2:
return True
if num%2 == 0:
return False
for i in range(3,num):
if num%i == 0:
return False
else:
return True
或
def is_prime(n):
if n <= 1:
return False
if n <= 3:
return True
if n % 2 == 0 or n % 3 == 0:
return False
i = 5
while i * i <= n:
if n % i == 0 or n % (i + 2) == 0:
return False
i += 6
return True
-
无限循环,记得一定要加上跳出条件
如下题
while True:
a,b=input().split()
c=0
m=0
if a=='0' and b=='0':
break
else:
for i in range(2,-1,-1):
m=int(a[i])+int(b[i])+m
if m>9:
c+=1
m=1
else:
m=0
print(c)
-
求数字字符串各位数之和
total = 0
str1 = "123456"
for i in str1: #逐一考虑字符串str1中的每个元素
total += int(i) #将每个元素转化成整型然后加起来
print(total)
-
输出三角形字符矩阵,注意v的妙用
n=int(input())
m=n
v=0
for j in range(n,0,-1):
for i in range(1,m+1):
print('{}'.format(chr(64+i+v)),end=' ')
print( )
m=m-1
v=v+j
-
任意钱任意鸡问题
def cxk1(m,n):
a,b=m,n
num=[]
for i in range(1,a//5+1):
for j in range(a//3+1):
k=a-i-j
if k>=0 and i*5+j*3+k//3==n and k%3==0:
num.append((i,j,k))
l=len(num)
return l
def cxk2(m,n):
a,b=m,n
num=[]
for i in range(1,a//5+1):
for j in range(a//3+1):
k=a-i-j
if k>=0 and i*5+j*3+k//3==n and k%3==0:
num.append((i,j,k))
return num
for i in range(int(input())):
a,b=input().split()
a,b=int(a),int(b)
print(cxk1(a,b))
for i in cxk2(a,b):
print(*i,sep=' ')
-
二维数组
1.求维度
输入上面格式的矩阵M,输出矩阵M的维度 例如, M=[[1,2],[3,4],[5,6] ] 返回 [3, 2]。
l=[]
while True:
m=input()
if m=='end':
break
m=m.split()
n=[]
for i in m:
n.append(int(i))
l.append(n)
print(len(l),len(l[0]))
2.矩阵转置
输入上面格式的矩阵M,输出矩阵M的转置。例如, M=[[1,2],[3,4],[5,6] ] ,转职为 [[1,3,5], [2,4,6]]。
l=[]
while True:
m=input()
if m=='end':
break
m=m.split()
n=[]
for i in m:
n.append(int(i))
l.append(n)
k=[[l[j][i] for j in range(len(l))] for i in range(len(l[0]))]
for i in k:
print(' '.join(str(j) for j in i))
3.求最大列
输入上面格式的矩阵M,寻找矩阵M中元素总和最大的列, 如上面矩阵中第三列元素的总和最大,则输出12(7+5=12)。
l=[]
while True:
m=input()
if m=='end':
break
m=m.split()
n=[]
for i in m:
n.append(int(i))
l.append(n)
k=[[l[j][i] for j in range(len(l))] for i in range(len(l[0]))]
w=[]
s=0
for i in k:
for j in i:
s+=j
w.append(s)
s=0
print(max(w))
4.列交换
输入上面格式的矩阵M,交换矩阵M的第i列和第j列,输出新的矩阵。
l=[]
while True:
m=input()
if m=='end':
break
m=m.split()
n=[]
for i in m:
n.append(int(i))
l.append(n)
i,j=input().split()
i,j=int(i),int(j)
for a in l:
a[i-1],a[j-1]=a[j-1],a[i-1]
for i in l:
print(' '.join(str(j) for j in i))
- 往字符串前补零到n位 s.zfill(n) s为字符串
- 判断是否为字母 s.isalpha() 可以判断「字符串」是否只包含[字母],包括大小写
-
求阶乘(复习递归)
def fac(num):
if num == 1:
return 1
else:
return num*fac(num-1
-
统计电话号码中的数字出现次数:
• 输入tel_num为11位电话号码,输出一个字典保存数字0~9出现的次数,字典的键为 数字,值为出现的次数。
• 例子:输入18689499171, 输出字典 {1:3, 4:1, 6:1, 7:1, 8:2, 9:3}
num = input() #输入电话号码
digits = {} #首先创建空字典
for i in num:
if i in digits: #如果字典里已经有该数字的键,则更新值
digits[i]+=1
else: #如果字典里没有该数字的键,则添加键值对
digits[i]=1
print(digits)
-
排序:itemgetter
>>>phonebook='Linda':'7750'.'Bob':'9345'.'Carol':'5834'
>>>from operator import itemgetter
>>>sorted(phonebook.items().key=itemgetter(l))#按字典中元素值进行排序
[('Carol','5834').('Linda'.'7750'.('Bob','9345')]
>>>sorted(phonebook.items().key=itemgetter(0))#按字典中元素的键进行排序
[('Bob','9345'),('Carol','5834'),('Linda'.'7750')]
>>> gameresult = [['Bob', 95.0. 'A’]. ['Alan'. $6 0. 'C’], ['Mandy'. 83 5. 'A']. ['Rob', 89 3. 'E’]]
>>>sorted(gameresull.key=itemgeter(0,1))#按姓名升序,姓名相同按分数升序排序
[['Alan'. s6 0. ']. ['Bob'. 95.0. 'A'], ['Mandy'. 83 5. 'A']. ['Rob'. 89.3.'E']]
>>>sored(gameresull.key=itemgeller(1,0))#按分数升序,分数相同的按姓名升序排序
[['Mandy'. s3 5. 'A']. ['Alan'. $6 0. 'C']. ['Rob'. 89 3. 'E']. ['Bob'. 95.0. 'A']]
>>>sored(gameresulr,key=itemgerer(2,0))#按等级升序,等级相同的按姓名升序排序
[['Bob'. 95 0. 'A']. ['Mandy'. 83 5.'A'], ['Alan'. 86.0.'C']. ['Rob'. 89 3.'E']]
练习
>pvonresult =[{'name':'Tom', 'exam': 80, 'lab': 70, 'grade': 75.0},
{'name':'David', 'exam': 70, 'lab': 80, 'grade': 75.0},
{'name':'Lucy', 'exam': 50, 'lab': 62, 'grade': 56.0},
{'name':'Bill', 'exam': 80, 'lab': 80, 'grade': 80}]
>sored(pythonresult .key=itemgerter( 'grade','exam'))
#按‘grade'升序,该值相同的按'exam'升序排序
[{'name': 'Lucy', 'exam': 50, 'lab': 62, 'grade': 56.0}
{'name': 'David', 'exam': 70,'lab':80, 'qrade': 75.0}
{'name': 'Tom', 'exam': 80,'lab':70. 'grade': 75.0}
{'name':'Bill', 'exam': 80, 'ab': 80,'grade': 80}]
例题如下
lst=[]
lst2=[]
for i in range(int(input())):
x=list(input().split())
lst.append(x)
from operator import itemgetter #记得引入
lst1=sorted(lst,key=itemgetter(0,1,2))
for j in lst1[1]:
lst2.append(str(j))
print('-'.join(lst2))
- 输出全排列
def swap(num, i, j):
for x in range(j, i, -1):
tmp = num[x]
num[x] = num[x-1]
num[x-1] = tmp
def swapback(num, i, j):
for x in range(i, j):
tmp = num[x]
num[x] = num[x+1]
num[x+1] = tmp
def permutation(numbers, start):
if start == len(numbers) - 1:
print("".join(numbers))
else:
for i in range(start, len(numbers)):
swap(numbers, start, i)
permutation(numbers, start + 1)
swapback(numbers, start, i)
def func():
num = int(input())
numbers = []
for i in range(1, num + 1):
numbers.append(str(i))
permutation(numbers, 0)
func()
-
递归实现斐波那契数列
def fib(n):
if n==1 or n==2:
return 1
elif n==0:
return 0
else:
return fib(n-1)+fib(n-2)
for i in range(int(input())):
print(fib(int(input())))
-
扑克牌排序
for i in range(int(input())):
n=int(input())
lst=list(map(str,input().split()))
lst1=[x for x in lst if x == '大王']
lst2=[x for x in lst if x == '小王']
lst3=[x for x in lst if x[:2] == '黑桃']
lst4=[x for x in lst if x[:2] == '红桃']
lst5=[x for x in lst if x[:2] == '梅花']
lst6=[x for x in lst if x[:2] == '方块']
lst0=['A','K','Q','J','1','9','8','7','6','5','4','3','2']
lst11=[lst3,lst4,lst5,lst6]
lsts=[]
for k in lst11:
for o in k:
k=sorted(k,key=lambda o:lst0.index(o[2])) #注意这一个排序,关键!!!
lsts.extend(k)
lstt=lst1+lst2+lsts
print(' '.join(lstt))
-
6174问题
def circle(num):
count = 0
while True:
digits = [int(d) for d in str(num)]
digits.sort(reverse=True)
a = int(''.join(map(str, digits)))
b = int(''.join(map(str, sorted(digits))))
num = a - b
if len(str(num)) < 4:
num *= 10
count += 1
if num == 0 or num == 6174:
count+=1
break
return count
n = int(input())
for _ in range(n):
print(circle(int(input())))
-
抄袭查找(函数)
def f1(m,n):
num=0
s=min(len(m),len(n))
for i in range(s):
if m[i]==n[i]:
num+=1
if num/s>=0.9:
return True
else:
return False
def f2(a,b):
for i in range(1,4):
if f1(a[i],b[i])==True:
print('{} {} {}'.format(a[0],b[0],i))
lstt=[]
l=int(input())
for i in range(l):
lst=[]
for k in range(4):
lst.append(str(input()))
lstt.append(lst)
for i in range(l):
for j in range(i+1,l):
f2(lstt[i],lstt[j])
-
一帮一(条件排列问题)
注意不同列表的运用
lst0=[]
lst1=[]
lst3=[]
l=int(input())
for i in range(l):
x,y=input().split()
if x=='0':
lst0.append(y)
elif x=='1':
lst1.append(y)
lst3.append(y)
p=int(l/2)
lst3=lst3[:p]
for j in lst3:
if j in lst0:
s=j+' '+lst1[-1]
print(s)
lst1.remove(lst1[-1])
elif j in lst1:
s=j+' '+lst0[-1]
print(s)
lst0.remove(lst0[-1])
-
字典的运用
例题1
a=int(input())
o=input()
b=int(input())
if o=='/' and b==0:
print('divided by zero')
else:
dic={'+':a+b,'-':a-b,'*':a*b,'/':a/b}
print('{:.2f}'.format(dic[o])) #字典值的获取
例题2
a=input().split()
b=input().split()
s1=set()
s2=set()
for i in a:
s1.add(int(i))
for i in b:
s2.add(int(i))
o=input()
dic={'|':s1|s2,'&':s1&s2,'-':s1-s2,'^':s1^s2}
if dic[o]==set():
print('None')
else:
lst=[]
for i in sorted(list(dic.get(o))): #好用的方法
lst.append(str(i))
print(','.join(lst))
-
杨辉三角第N行
def sheep(n):
row = [1]
for i in range(n):
row = [x + y for x, y in zip([0] + row, row + [0])]
return row
n=int(input())
s=' '.join(str(i) for i in sheep(n-1))
print('{} '.format(s))