目录中首数字代表 Python Tip 中的题号;
Python Tip
编程环境:Python 3.7 under Windows 10 Professional 1809
IDE:JetBrains PyCharm Community Edition 2018.3.5 x64
2 列表排序
给你一个列表 L, 对L进行升序排序并输出排序后的列表。
例如:L = [8,2,50,3]
则输出:[2,3,8,50]
# 冒泡
L = [8,2,50,3]
for i in range(len(L)):
for j in range(len(L)):
if L[i]<L[j]:
temp=L[i]
L[i]=L[j]
L[j]=temp
print(L)
L=[2,8,3,50]
L.sort()
print(L)
L=[2,8,3,50]
x = 0
y = len(L)
s = []
while x<y:
s.append(min(L))
L.remove(min(L))
x = x + 1
print(s)
3 字符串逆序
给你一个字符串 a, 请你输出逆序之后的a。
例如:a=‘xydz’
则输出:zdyx
a=‘xydz’
print a[::-1] # 列表切片
# 字符串提取与相加
a=‘xydz’
l=''
for x in a:
l = x + l
print l
4 输出字典key
给你一字典a,如a={1:1,2:2,3:3},输出字典a的key,以’,‘连接,如‘1,2,3’。要求key按照字典序升序排列(注意key可能是字符串)。
例如:a={1:1,2:2,3:3}, 则输出:1,2,3
# 即使 key 是字符串依然适用
a={1:1,2:2,3:3}
b=list(a.keys())
l=len(b)
c=[]
for i in range(l):
c.append(str(b[i]))
print(",".join(c)) # 在列表 c 中插入 ","
# 看到别人的方法
a={"d":1,2:2,3:3}
print(','.join(str(n) for n in a.keys()))
5 输出字符奇数位置的字符串
给你一个字符串 a, 输出a中奇数位置字符构成的字符串(位置编号从1开始)。
例如:a=‘xyzwd’
则输出:xzd
# 列表切片(字符串就是一个以 \0 结尾的字符列表)
print a[::2]
a='xyzwd'
x=''
for i in range(len(a)):
if i % 2 == 0:
x+=a[i]
print(x)
a='xyzwd'
b=[]
i=0
while i<=len(a)-1:
b.append(a[i])
i+=2
print("".join(b))
6 求解100以内的所有素数
输出100以内的所有素数,素数之间以一个空格区分(注意,最后一个数字之后不能有空格)。
素数即质数,只能被 1 和 自身整除的大于 1 的正整数;
l=[]
for i in range(2,101):
fg = 0 # 标记位
for j in range(2,i-1):
if i % j ==0: # 该正整数可以被除 1 和其自身外的正整数整除,那么它就不是质数
fg = 1
break
if fg == 0:
l.append(str(i)) # number 强制转换成 string 必须要在 append 时转换(合成成 string,不然就是 number list)
print(' '.join(l)) #每个素数之间用空格分开
7 求矩形面积
已知矩形长a,宽b,输出其面积和周长,面积和周长以一个空格隔开。
例如:a = 3, b = 8
则输出:24 22
a = 3
b = 8
l=[]
l.append(str(a*b))
l.append(str(a*2+b*2))
# area=a*b
# perimeter=a*2+b*2
print(" ".join(l))
8 求中位数
给你一个整数列表L, 输出L的中位数(若结果为小数,则保留一位小数)。
例如: L=[0,1,2,3,4]
则输出:2
中位数就是一个有序序列中位于中间的数值,若该序列元素个数为奇数,则最中间的就是中位数,若为偶数,则最中间的两个数的均值为该有序序列的中位数
L=[3,0,1,2]
L.sort() # list 排序
l=len(L)
if l % 2 == 0 : # list 中共有偶数个数
median = (L[int(l/2)] + L[int((l/2)-1)]) / 2.0 # 除法运算的结果的 type 为 float,float 不能作为 list 的 index,需进行强制转换成 int,这里除数是 2 还是 2.0 都没关系,都会自动转换成 float
else: # list 中共有奇数个数
median = L[int(l/2)]
print(median)
9 最大公约数
给你两个正整数a和b, 输出它们的最大公约数。
例如:a = 3, b = 5
则输出:1
a=3
b=5
l1=[]
l2=[]
if a == 1 or b == 1: #考虑 a 和 b 都是 1 的情况
print(1)
else: #考虑 a 和 b 互为倍数的情况
if a%b == 0:
print(b)
elif b%a == 0:
print(a)
else: #除以上两种情况外的第三种情况
for i in range(1,a+1): #找出 a 的所有约数
if a%i == 0:
l1.append(i)
for j in range(1,b+1): #找出 b 的所有约数
if b % j == 0:
l2.append(j)
# print(set(l1)) # check the set
print(max(set(l1) & set(l2))) # 利用集合,取俩数集的交集的最大数
10 最小公倍数
给你两个正整数a和b, 输出它们的最小公倍数。
例如:a = 3, b = 5
则输出:15
a = 3
b = 5
l1=[]
l2=[]
if a == 1:
print(b)
elif b == 1:
print(a)
else:
if a%b == 0:
print(a)
elif b%a == 0:
print(b)
else:
for i in range(1,a+1):
if a%i == 0:
l1.append(i)
for j in range(1,b+1):
if b % j == 0:
l2.append(j)
print((a*b)/(max(set(l1) & set(l2)))) # 把 list 转为集合 set ,利用集合的交集取俩交集中的最大元素,该元素为 a 、b 的最大公约数,而最小公倍数=最大公约数*各自的余数之积
11 结尾0的个数
给你一个正整数列表 L, 输出L内所有数字的乘积末尾0的个数。(提示:不要直接相乘,数字很多,相乘得到的结果可能会很大)。
例如: L=[2,8,3,50],
则输出:2
from functools import reduce # python 3 中调用 reduce 需要 import...
L=[2,8,3,50]
m = reduce(lambda x, y: x * y, L) # 调用 lambda 匿名函数,reduce 函数会对 lambda 函数进行递归并积累计算结果(每次递归的计算结果会赋值给 lambda 的第一个参数 x)直到计算完最后一个输入参数
count = 0 # 记录 0 的个数
while (m % 10 == 0): # 判断 m 最后一位是否为 0
count += 1
m /= 10 # 去掉最后一个 0
print(count)
12 结尾非零数的奇偶性
给你一个正整数列表 L, 判断列表内所有数字乘积的最后一个非零数字的奇偶性。如果为奇数输出1,偶数则输出0.。
例如:L=[2,8,3,50]
则输出:0
from functools import reduce
L=[2,8,3,50]
product = 1
for i in range(len(L)): # 得到 list 内元素之积
product *= L[i]
# product = reduce(lambda x,y:x*y,L) # 以上累积也可以用 reduce 和 lambda 得到
while (product % 10==0):
product /= 10 # 去掉最后一位
if product % 2 == 0: # 判断最后一位是否为偶数
print(0)
else:
print(1)
13 光棍的悲伤(二进制数中 1 的个数)
光棍们对1总是那么敏感,因此每年的11.11被戏称为光棍节。小Py光棍几十载,光棍自有光棍的快乐。让我们勇敢地面对光棍的身份吧,现在就证明自己:给你一个整数a,数出a在二进制表示下1的个数,并输出。
例如:a=7
则输出:3
a=7
count = 0
x = str(bin(a)) # 得到 a 的二进制数(字符串格式)
for i in x:
if i == '1':
count += 1
print(count)
a = 7
print(str(bin(a)).count('1'))
14 Python之美(Python之禅)
输出Python之禅。
注意:输出python之禅的源码即可,不要转换为英文。(小小的提示:print this.s)
from this import *
print(s)
15 大小写转换
给定一个字符串a, 将a中的大写字母 转换成小写,其它字符不变,并输出。
例如:a=“aaaaaabbbDDDDD”
则输出:aaaaaabbbddddd
a="aaaaaabbbDDDDD"
print(a.lower())
# print(a.upper()) # 转换成大写
16 人民币金额打印
银行在打印票据的时候,常常需要将阿拉伯数字表示的人民币金额转换为大写表示,现在请你来完成这样一个程序。
在中文大写方式中,0到10以及100、1000、10000被依次表示为: 零 壹 贰 叁 肆 伍 陆 柒 捌 玖 拾 佰 仟 万
以下的例子示范了阿拉伯数字到人民币大写的转换规则:
1 壹圆
11 壹拾壹圆
111 壹佰壹拾壹圆
101 壹佰零壹圆
-1000 负壹仟圆
1234567 壹佰贰拾叁万肆仟伍佰陆拾柒圆
现在给你一个整数a(|a|<100000000), 请你打印出人民币大写表示.
例如:a=1
则输出:壹圆
注意:请以Unicode的形式输出答案。提示:所有的中文字符,在代码中直接使用其Unicode的形式即可满足要求,中文的Unicode编码可以通过如下方式获得:u’壹’。
注意:代码无需声明编码!!不要在代码头部声明文件编码,否则会导致语法错误!
Note:数据已于2013-11-19日加强,原来通过的代码可能不能再次通过。
a=-56509234845
num_list=u"零壹贰叁肆伍陆柒捌玖"
wei_list=u'万圆拾佰仟万拾佰仟亿拾佰仟'
def GetDX(num):
s=''
flag=0 # 正负标记位:0-正,1-负
if num<0:
num=-num
flag=1
wei=len(str(num))
for i in str(num): # 从头遍历参数 num
s=s+num_list[int(i)]+wei_list[wei]
wei=wei-1
s=Modify(s)
if num==0:
s=u'零圆'
if flag:
s=u'负'+s
return s
def Modify(s):
if u'零仟' in s:
s=s.replace(u'零仟',u'零')
if u'零佰' in s:
s=s.replace(u'零佰',u'零')
if u'零拾' in s:
s=s.replace(u'零拾',u'零')
while u'零零' in s:
s=s.replace(u'零零',u'零')
if u'零万' in s:
s=s.replace(u'零万',u'万')
if u'零圆' in s:
s=s.replace(u'零圆',u'圆')
return s
ans=GetDX(a)
print(ans)#.deocde('utf-8')
17 公约数的个数
给你两个正整数a,b, 输出它们公约数的个数。
例如:a = 24, b = 36
则输出:6
a = 24
b = 36
l1=[]
l2=[]
count = 0
if a == 1 or b == 1: #考虑 a 和 b 都是 1 的情况
count += 1
print(count)
else:
for i in range(1,a+1): #找出 a 的约数
if a%i == 0:
l1.append(i)
for j in range(1,b+1): #找出 b 的约数
if b % j == 0:
l2.append(j)
print(len(set(l1) & set(l2))) # list 转换为 set ,求俩 set 的交集
18 逆解最大公约数与最小公倍数
我们经常遇到的问题是给你两个数,要你求最大公约数和最小公倍数。今天我们反其道而行之,给你两个数a和b,计算出它们分别是哪两个数的最大公约数和最小公倍数。输出这两个数,小的在前,大的在后,以空格隔开。若有多组解,输出它们之和最小的那组。注:所给数据都有解,不用考虑无解的情况。
例如:a=3, b = 60
则输出:12 15
在这里插入代码片