上
1、冒泡排序
方法一:
lis = [23,34,23,45,67,222,33,78,98,43,2,3,76,-34,-23]
def sortport():
for i in range(len(lis)-1):
for j in range(len(lis)-1-i):
if lis[j] > lis[j+1]:
lis[j],lis[j+1] = lis[j+1],lis[j]
return lis
print(sortport())复制代码
方法二:
list = [1,4,1,34,23,54,34]
def maopao(list):
for i in range(len(list)):
for j in range(len(list)-1):
if list[i] > list [j]:
list[j], list[i] = list[i], list[j] #从大到小
print(list)复制代码
2、编程用sort进行排序,然后从最后一个元素开始判断,去除重复数字
方法一:
a=[1,2,4,2,4,5,7,10,5,5,7,8,9,0,3]
a.sort()
last=a[-1]
for i in range(len(a)-2,-1,-1):
if last==a[i]:
del a[i]
else:
last=a[i]
print(a)复制代码
方法二:可以从前面的元素开始判断去除重复的数字
a = [11, 11, 22, 22, 33, 44, 55, 66, 88, 99]
for i in range(len(a)):
for j in range(i + 1 , len(a) - 1):
if a[i] == a[j]:
del a[j]
j -= 1
print(a)复制代码
3、打印九九乘法表
一行代码实现
print('\n'.join([' '.join(['%s*%s=%-2s' % (y,x,x*y) for y in range(1,x+1)]) for x in range(1,10)]))复制代码
for 循环
for i in range(1, 10):
for j in range(1, i+1):
print('{}x{}={}\t'.format(j, i, i*j),end='')
# print('%d x %d = %d \t'%(i, j, i*j),end='')
print()
# 通过指定end参数的值,可以取消在末尾输出回车符,实现不换行。复制代码
for i in range(10):
for j in range(i+1):
print("%d*%d=%2d "%(i,j,i*j),end="")
print()复制代码
while循环
n = 1
while n <= 9:
m = 1
while m<= 9:
print("%d*%d=%2d "%(n,m,n*m), end="")
m += 1
print()
n += 1复制代码
4、计算阶乘
方法一:
def fac():
num = int(input("请输入一个数字:"))
factorial = 1
# 查看数字是否是负数,0 或者 正数
if num < 0:
print("抱歉,负数没有阶乘")
elif num == 0:
print("0 的阶乘为 1")
else:
for i in range(1, num + 1):
factorial = factorial * i
print("%d 的 阶乘为 %d" % (num, factorial))
fac()复制代码
方法二:
def factorial(n):
result = n
for i in range(1, n):
result *= i
return result
print(factorial(5))复制代码
方法三:
def fact(n):
if n == 1:
return 1
return n * fact(n - 1)
print(fact(5))复制代码
5、计算x的n次方的方法
def power(x,n):
s = 1
while n > 0:
n = n - 1
s = s * x
return s
print(power(2,3))复制代码
6、计算a*a + b*b + c*c + ……
def calc(*numbers):
sum = 0
for n in numbers:
sum = sum + n * n
return sum
print(calc(*[1,2,3]))复制代码
7、将list中字符串变成小写
L = ['Hello','World','IBM','Apple']
L2 = []
for s in L:
L2.append(s.lower())
print(L2)复制代码
8、把原字典的键值对颠倒并生产新的字典
dict1 = {"A":"a","B":"b","C":"c"}
dict2 = {y:x for x,y in dict1.items()}
print(dict2)复制代码
9、替换列表中所有的3为3a
num = ["harden","hampard",3,23,45,23,55,3,3,3,3,4356,546]
# print(num.count(3))
# print(num.index(3))
for i in range(num.count(3)): #获取3出现的次数
ele_index = num.index(3) #获取首次3出现的坐标
num[ele_index] = "3a" #修改3为3a
print(num)复制代码
10、打印每个名字
L = ["James","Meng","Xin"]
for i in range(len(L)):
print("Hellow,%s"%L[i])
复制代码
11、合并去重
list1 = [1,2,3,23,65,3,3,9,8]
list2 = [1,2,3,45,65,3,3,87,45]
list3 = list1 + list2
print(list3) #不去重进行两个列表的组合
print(set(list3)) #去重,类型为set需要转化为list
print(list(set(list3)))复制代码
12、随机生成验证码
方法一:
import random
list1 = []
# chr() 用一个范围在 range(256)内的(就是0~255)整数作参数,返回一个对应的字符。
for i in range(65,91):
list1.append(chr(i)) #通过for循环遍历ASCII追加到空列表中
for j in range(97,123):
list1.append(chr(j))
for k in range(48,58):
list1.append(chr(k))
ma = random.sample(list1,6)
print(ma) #获取到的为空列表
ma = ''.join(ma) #将列表转化为字符串print(ma)复制代码
方法二:
import random,string
str1 = "0123456789"
str2 = string.ascii_letters
str3 = str1 + str2
ma1 = random.sample(str3,6)
ma1 = ''.join(ma1)
print(ma1)复制代码
13、计算平方根
num = float(input('请输入一个数字: '))
num_sqrt = num ** 0.5
print(' %0.2f 的平方根为 %0.2f'%(num,num_sqrt))复制代码
14、判断字符串是否只由数字组成
def is_number(s):
try:
float(s)
return True
except ValueError:
pass
try:
import unicodedata
unicodedata.numeric(s)
return True
except (TypeError, ValueError):
pass
return False
# print(is_number('12w3'))
chri = "123w"
print(chri.isdigit()) #检测字符串是否只由数字组成
print(chri.isnumeric()) #检测字符串是否只由数字组成,这种方法只针对unicode对象复制代码
15、判断奇偶数
方法一:
num = int(input("请输入一个数字: "))
if (num % 2) == 0:
print("{0} 是偶数".format(num))
else:
print("{0} 是奇数".format(num))复制代码
方法二:
while True:
try:
num = int(input('请输入一个整数: ')) #判断输入是否为整数
except ValueError: #不是纯数字需要重新输入
print("输入的不是整数!")
continue
if num % 2 == 0:
print("偶数")
else
:
print("奇数")
break复制代码
16、判断闰年
方法一:
year = int(input("输入一个年份: "))
if (year % 4) == 0:
if (year % 100) == 0:
if (year % 400) == 0:
print("{0} 是闰年".format(year)) #整百年能被400整除是闰年
else:
print("{0} 不是闰年".format(year))
else:
print("{0} 是闰年".format(year)) #非整百年能被4整除为闰年
else:
print("{0} 不是闰年".format(year))复制代码
方法二:
year = int(input("输入一个年份: "))
if (year % 4) == 0 and (year % 100) != 0 or (year % 400) == 0:
print("{0} 是闰年".format(year))
else:
print("{0} 不是闰年".format(year))复制代码
方法三:
import calendar #日历模块
print(calendar.month(2018, 6))
year = int(input("请输入年份:"))
check_year = calendar.isleap(year)
if check_year == True:
print("%d是闰年"% year)
else:
print("%d是平年"% year)复制代码
17、获取最大值
方法一:
# 获取最大值N = int(input("输入需要对比大小数字的个数:"))
print("请输入需要对比的数字:")
num = []
for i in range(1,N+1):
temp = int(input("请输入第%d个数字:" % i))
num.append(temp)print('您输入的数字为:',num)
print('最大值为:',max(num))复制代码
方法二:
N = int(input("输入需要对比大小数字的个数:\n"))
num = [ int(input('请输入第 %d 个对比数字:\n'%i))for i in range(1,N+1) ]
print('您输入的数字为:',num)
print('最大值为:',max(num))复制代码
18、斐波那契数列
斐波那契数列(Fibonacci sequence),又称黄金分割数列、因数学家列昂纳多·斐波那契(Leonardoda Fibonacci)以兔子繁殖为例子而引入,故又称为“兔子数列”,指的是这样一个数列:1、1、2、3、5、8、13、21、34、……在数学上,斐波纳契数列以如下被以递归的方法定义:F(1)=1,F(2)=1, F(n)=F(n-1)+F(n-2)(n>=2,n∈N*)
斐波那契数列,难点在于算法,还有如果变成生成器,generator,就要用for循环去遍历可迭代的generator
方法一:递归法
def fib_recur(n):
assert n >= 0, "n > 0"
if n <= 1:
return n
return fib_recur(n-1) + fib_recur(n-2)
for i in range(1, 20):
print(fib_recur(i), end=' ')复制代码
方法二:递推法
def fib_loop(n):
a, b = 0, 1
for i in range(n + 1):
a, b = b, a + b
return a
for i in range(20):
print(fib_loop(i), end=' ')复制代码
递推法,就是递增法,时间复杂度是 O(n),呈线性增长,如果数据量巨大,速度会越拖越慢
方法三:矩阵
### 1
import numpy
def fib_matrix(n):
res = pow((numpy.matrix([[1, 1], [1, 0]])), n) * numpy.matrix([[1], [0]])
return res[0][0]
for i in range(10):
print(int(fib_matrix(i)), end=', ')
### 2
# 使用矩阵计算斐波那契数列
def Fibonacci_Matrix_tool(n):
Matrix = numpy.matrix("1 1;1 0")
# 返回是matrix类型
return pow(Matrix, n) # pow函数速度快于 使用双星好 **
def Fibonacci_Matrix(n):
result_list = []
for i in range(0, n):
result_list.append(numpy.array(Fibonacci_Matrix_tool(i))[0][0])
return result_list
# 调用
Fibonacci_Matrix(10)复制代码
方法四:生成器
def fib_loop_while(max):
a, b = 0, 1
while max > 0:
a, b = b, a + b
max -= 1
yield a
for i in fib_loop_while(10):
print(i,end=',')复制代码
方法五:类实现内部魔法方法
class Fibonacci(object):
"""斐波那契数列迭代器"""
def __init__(self, n):
"""
:param n:int 指 生成数列的个数
"""
self.n = n
# 保存当前生成到的数据列的第几个数据,生成器中性质,记录位置,下一个位置的数据
self.current = 0
# 两个初始值
self.a = 0
self.b = 1
def __next__(self):
"""当使用next()函数调用时,就会获取下一个数"""
if self.current < self.n:
self.a, self.b = self.b, self.a + self.b
self.current += 1
return self.a
else:
raise StopIteration
def __iter__(self):
"""迭代器的__iter__ 返回自身即可"""
return self
if __name__ == '__main__':
fib = Fibonacci(15)
for num in fib:
print(num,end=',')
# for循环的本质是通过不断调用next()函数实现的
for x in [1, 2, 3, 4, 5]:
pass
# 相当于
# 首先获取可迭代对象
it = iter([1, 2, 3, 4, 5])
# while next
while True:
try:
next(it)
except StopIteration:
# 遇到StopIteration就退出循环
break复制代码
19、十进制转二进制、八进制、十六进制
# 获取输入十进制数
dec = int(input("输入数字:"))
print("十进制数为:", dec)
print("转化二进制为:", bin(dec))
print("转化八进制为:", oct(dec))
print("转化十六进制为:", hex(dec))复制代码
20、简单计算器
# 定义函数
def add(x, y):
""" 相加 """
return x + y
def subtract(x, y):
""" 相减 """
return x - y
def multiply(x, y):
""" 相乘 """
return x * y
def divide(x, y):
""" 相除 """
return x / y
# 用户输入print("选择运算:")
print("1、相加")
print("2、相减")
print("3、相乘")
print("4、相除")
choice = input("输入你的选择(1/2/3/4):")
num1 = int(input("输入第一个数字:"))
num2 = int(input("输入第二个数字:"))
if choice == "1":
print(num1, "+", num2, "=", add(num1, num2))
elif choice == "2":
print(num1, "-", num2, "=", subtract(num1, num2))
elif choice == "3":
print(num1, "*", num2, "=", multiply(num1, num2))
elif choice == "4":
if num2 != 0:
print(num1, "/", num2, "=", divide(num1, num2))
else:
print("分母不能为0")
else:
print("非法输入")复制代码
21、生成日历
# 引入日历模块
import calendar
# 输入指定年月
yy = int(input("输入年份:"))
mm = int(input("输入月份:"))
# 显示日历
print(calendar.month(yy, mm))复制代码
22、字符串判断
#测试实例一
print("测试实例一")
str = "runoob.com"print(str.isalnum())
#判断所有字符都是数字或者字母
print(str.isalpha()) #判断有所字符都是字母
print(str.isdigit()) #判断有所字符都是数字
print(str.islower()) #判断有所字符都是小写
print(str.isupper()) #判断有所字符都是大写
print(str.istitle()) #判断有所单词都是首字母大写,像标题
print(str.isspace()) #判断有所字符都是空白字符、\t、\r、\n
print("-------------------------")
print("测试实例二")
str = "Bake corN"
print(str.isalnum())
print(str.isalpha())
print(str.isdigit())
print(str.islower())
print(str.isupper())
print(str.istitle())
print(str.isspace()) 复制代码
23、字符串大小写转换
str = "https://juejin.im/user/"
print(str.upper()) # 把所有字符中的小写字母转化成大写字母
print(str.lower()) # 把所有字符中的大写字母转化小写字母
print(str.capitalize()) # 把第一个字母转化成大写字母,其余小写
print(str.title()) # 把每个单词的第一个字母转化为大写,其余为小写复制代码
24、计算每个月的天数
import calendar
monthRange = calendar.monthrange(2019,11)
print(monthRange)复制代码
25、获取昨天的日期
# 引入 datetime 模块
import datetimedef getYesterday():
today = datetime.date.today()
oneday = datetime.timedelta(days=1)
yesterday = today - oneday
return
yesterday
print(getYesterday())复制代码
26、趣味自然数
掌握使用自定义函数实现水仙花数和完全数
水仙花数(narcissistic number)中的narcissistic本意是“自我陶醉,自赏的,自恋的”。在希腊神话中,貌美青年那喀索斯(narcissus)爱上了自己在水中的倒影,他死后化作水仙花,此花即因之命名。所以,水仙花数也称为自恋数,自幂数,本名为超完全数字不变数(pluperfect digital invariant, PPDl)
自幂数是指一个 n 位数,它的每个位上的数字的 n 次幂之和等于它本身。
n为1时,自幂数称为独身数。显然,0,1,2,3,4,5,6,7,8,9都是自幂数。
n为2时,没有自幂数。
n为3时,自幂数称为水仙花数,有4个:153,370,371,407;
n为4时,自幂数称为四叶玫瑰数,共有3个:1634,8208,9474;
n为5时,自幂数称为五角星数,共有3个:54748,92727,93084;
n为6时,自幂数称为六合数, 只有1个:548834;
n为7时,自幂数称为北斗七星数, 共有4个:1741725,4210818,9800817,9926315;
n为8时,自幂数称为八仙数, 共有3个:24678050,24678051,88593477;
n为9时,自幂数称为九九重阳数,共有4个:146511208,472335975,534494836,912985153;
n为10时,自幂数称为十全十美数,只有1个:4679307774。复制代码
话不多说,来代码:
#如果一个 3 位数等于其各位数字的立方和,则称这个数为水仙花数。
#例如:153 = 1^3 + 5^3 + 3^3,因此 153 就是一个水仙花数。
#方法1:
def flower1(a,b): # 限制范围
for i in range(a,b):
sum = 0 #用来存放各个位数的立方和
temp = i
while temp:
sum += (temp%10) ** 3 #累加
temp //= 10 # // 取整除 - 向下取接近除数的整数
if sum == i:
print(i)flower1(10,1000) # 153 370 371 407复制代码
还可以先定义一个求幂次方和的函数
import math# 定义一个函数求取列表中的幂次方和
def pow3(list):
sum = 0
for i in list:
sum += math.pow(int(i),3)
return sum复制代码
# 方法2 依次求取各个位数 def flower():
for i in range(100,1000):
a = i // 1000 # 取最高位
b = i //100 % 10 # 取百位
c = i //10 % 10 # 取十位
d = i % 10 # 取末位
list = [a,b,c,d]
if pow3(list) == i:
print('100-1000以内的水仙花数有:%d'%i)
flower()
#100-1000以内的水仙花数有:153
#100-1000以内的水仙花数有:370
#100-1000以内的水仙花数有:371
#100-1000以内的水仙花数有:407复制代码
# 方法3: 数值转为list def flower2():
for i in range(100, 1000):
list1 = list(str(i))
if pow3(list1) == i:
print('100-1000以内的水仙花数有:%d'%i)
flower2()
#100-1000以内的水仙花数有:153
#100-1000以内的水仙花数有:370
#100-1000以内的水仙花数有:371
#100-1000以内的水仙花数有:407复制代码
27、完全数
如果一个数恰好等于它的因子之和,则称该数为“完全数” 。各个小于它的约数(真约数,列出某数的约数,去掉该数本身,剩下的就是它的真约数)的和等于它本身的自然数叫做完全数(Perfect number),又称完美数或完备数。
例如:第一个完全数是6,它有约数1、2、3、6,除去它本身6外,其余3个数相加,1+2+3=6。第二个完全数是28,它有约数1、2、4、7、14、28,除去它本身28外,其余5个数相加,1+2+4+7+14=28那么问题来了:如何用python去求出下一个(大于28的)完全数?(求出1000以内所有的完全数)
方法一
# coding:utf-8
a=range(1,1001)
b=range(1,1001)
result=[]
for i in a:
tmp=[]
for k in b:
if k<i:
if not i%k:
tmp.append(k)
else:
continue
else:
break
count=0
for m in tmp:
count=count+m
if count==i:
result.append(i)
else:
continue
print result复制代码
方法二
# coding:utf-8
a=range(1,1001)
b=range(1,1001)
result=[]
for i in a:
tmp=[]
for k in b:
if k<i:
if not i%k:
tmp.append(k)
else:
continue
else:
break
count=sum(tmp)
if count==i:
result.append(i)
else:
continue
print result复制代码
#方法三是直接通过遍历出list a中的元素后,生成一个小于次元素的list,然后取余
#对于range(1,0) 我的解释是:range的理解应该是range是先用我们指定的条件生成一个列表,
然后用for循环取出来(此句出自python核心编程第八章),range(1,0),start=1,stop=0,step=1,
这样的条件生成的#的列表实际是上空的,即为False复制代码
a=range(1,1001)
perfect=[]
for i in a:
tmp=[]
for k in range(1,i):
if not i%k:
tmp.append(k)
count=sum(tmp)
if count==i:
perfect.append(i)
print perfect复制代码
for i in range(1,1000):
s=0
for k in range(1,i):
if i%k==0:
s=s+k
if i==s:
print i复制代码
28、最大公约数和最小公倍数
掌握结合python循环求解最大公约数
def hcf(x, y):
'''该函数返回两个数的最大公约数'''
# 获取最小值
if x > y:
smaller = y
else:
smaller = x
for i in range(1, smaller + 1):
if ((x % i == 0) and (y % i == 0)):
hcf = 1
return hcf
# 用户输入两个数字
num1 = int(input("输入第一个数字:"))
num2 = int(input("输入第二个数字:"))
print(num1, "和", num2, "的最大公约数为", hcf(num1, num2))复制代码
最小公倍数
# 定义函数
def lcm(x, y):
#获取最大的数
if x > y:
greater = x
else:
greater = y
while(True):
if ((greater % x == 0) and (greater % y == 0)):
lcm = greater
break
greater += 1
return lcm
# 获取用户输入
num1 = int(input("输入第一个数字:"))
num2 = int(input("输入第二个数字:"))
print(num1, "和", num2, "的最小公倍数为", lcm(num1, num2)) 复制代码
29、浮屠增级
掌握使用枚举解决浮屠增级问题
30、千钱百鸡
掌握使用枚举法解决千钱百鸡问题
百钱百鸡:我国古代数学家张丘建在《算经》一书中提出的数学问题:鸡翁一值钱五,鸡母一值钱三,鸡雏三值钱一。百钱买百鸡,问鸡翁、鸡母、鸡雏各几何?
译文:公鸡一只5元,母鸡一只3元,小鸡3只1元。如何用100元买100只鸡。其中公鸡,母鸡,小鸡的数量各是多少
for x in range(0,20):
for y in range(0,33):
z=100-x-y
if 5*x+3*y+z/3 == 100:
print('公鸡:%s 母鸡:%s 小鸡:%s'%(x, y, z))复制代码
随机数法
import random
while True:
x = random.randrange(0,20)
y = random.randrange(0,33)
z = random.randrange(0,100)
if 5*x+3*y+z/3 == 100 and x+y+z == 100:
print('公鸡:',x)
print('母鸡:',y)
print('小鸡:',z)复制代码
31、猜数字的小游戏
# python实现猜数字游戏,主要用于练习for循环和if else。
# 需求如下:# 1、随机生成一个1-100之间的数。
# 2、7次猜数字的机会,如果没有猜正确,游戏结束。
# 3、输入字母q,则退出游戏。
import random
num = random.randint(1,100)
guess_chances = 7
print('您只有7次猜数字的机会哦!')
for i in range(1,guess_chances + 1):
print('这是第'+ str(i) + '次猜数字')
guess = input('请输入数字:')
if guess.isdigit():
guess = int(guess)
if guess < num:
print('您输入的数字太小了,您还有' + str(guess_chances - i)+'次机会,请重新输入:')
elif guess > num:
print('您输入的数字太大了,您还有' + str(guess_chances - i)+'次机会,请重新输入:')
elif guess == num:
print('恭喜您猜对了')
break
elif guess == 'q':
print('退出游戏!')
break
else:
print('输入的内容必须为整数,请重新输入:')
while (guess_chances - i) == 0:
print('您输入已经超过7次,游戏结束!')
break复制代码
随机数字小游戏
import random
i = 1
a = random.randint(0,100)
b = int(input('请输入0-100中的一个数字\n然后查看是否与电脑一样:'))
while a != b:
if a > b:
print('你第%d次输入的数字小于电脑随机数字'%i)
b = int(input('请再次输入数字:'))
else:
print('你第%d次输入的数字大于电脑随机数字'%i)
b = int(input('请再次输入数字:'))
i += 1
else:
print('恭喜你,你第%d次输入b的数字与电脑的随机数字%d一样'%(i,b))复制代码
32、打印图形
三角形
for i in range(10):
for j in range(1,i):
print("*",end="")
print()
for i in range(10):
for j in range(10-i):
print("*",end="")
print()复制代码
正方形
for i in range(5):
for j in range(10):
print("*",end="")
print()复制代码
正三角形
for i in range(1,6):
for j in range(1,6-i):
print(" ",end="")
for k in range(1,i+1):
print("* ",end="")
print("")复制代码
33、请编写1-100所有数的和。
#for循环
sum = 0
for i in range(1,101):
sum += i
print(sum)
#while循环
n = 1
sum = 0while n < 101:
sum += n
n += 1
print(sum)复制代码
34、编写代码,实现求100-200里面所有的素数
sum = 0
for i in range(100,200):
flag = True
for j in range(2,i):
if i % j == 0:
flag = False
break
if(flag):
print(i,"是素数")
sum += 1
print("一共",sum,"个素数")复制代码
35、汉诺塔()
ta1 = [i for i in range(10,0,-1)]
ta2 = []
ta3 = []
n = len(ta1)
def move(n, ta1,ta2,ta3):
if n == 1:
ta3.append(ta1.pop())
else:
move(n - 1,ta1,ta3,ta2)
ta3.append(ta1.pop())
move(n-1,ta2,ta1,ta3)
move(n,ta1,ta2,ta3)
print(ta1)
print(ta3)复制代码
36、字符串,列表,字典,综合实战1
倍数又是5的倍数就用appleorange代替。注意:只能用2行代码搞定
我们最经常想到的应该是这种方法:
for i in range(1,21):
if (i%3==0 and i%5!=0):
i = 'apple'
elif (i%5==0 and i%3!=0):
i = 'orange'
elif (i%3==0 and i%5==0):
i = 'appleorange'
print(i,end=',')复制代码
经典的写法:
for i in range(1,21):
print('apple'[i%3*5::]+'orange'[i%5*6::] or i,end=" , ")复制代码
-
其实算法很简单,就是i对3和5取模,但是能2行搞定,精妙之处在于利用了字符串切片的一个特性
-
比如apple[5::],结果为空,为什么,因为下标5的位置不存在,所以为空,那么apple[i%3*5],意味着i在1,2,3,4的时候取3的模,结果是1,2,0,1,然后用一个很巧妙的方法*5(5其实是apple的长度),做了一个偏移
-
这样在3的整数的时候下面0*5=0,也就是从0开始取apple,而1,2,4的时候取3模是1,2,1,再乘以5就越界了所以取的apple为空.
-
同理orange也是这样的,取5的模,然后*6(6是orange的长度)偏移
-
最后用了一个or i ,先来说一下or, Python 对or 的判断是,print A or B ,若A为true,则结果为True,若A是false再判断B,B是true,则结果是True
-
print 'apple'[i%3*5::]+'orange'[i%5*6::] or i,表示当apple和orange偏移越界了就都为空的时候,就取i的值,是1,2,4,7...
37、字符串,列表,字典,综合实战2
比如说我有一串字符串人名:
names=' Kunpen Ji, Li XIAO, Caron Li, Donl SHI, Ji ZHAO, Fia YUAN Y, Weue DING, Xiu XU, Haiying WANG, Hai LIN, Jey JIANG, Joson WANG E, Aiyang ZHANG, Hay MENG, Jak ZHANG E, Chang Zhang, Coro ZHANG'
,我希望能做到下面3点
问题1:排序,按照名字A-Z排序
问题2:找出里面姓”ZHANG”有几个
问题3:找出名字里面最长的人
首先我们要做的对字符串进行分割去掉','然后就变成了一个长的列表,然后对列表进行排序,第一个问题就解决了.
for index,n in enumerate(sorted(names.split(','))):
print(index+1,n)复制代码
分析问题2:
接下来,我们需要找出姓"ZHANG",因为名字里面有英文名字和中文名字,有的后面还跟E/Y,所以我们先定义一个函数,把分割后的新的名字列表,取出每一个名字,然后解析,翻转,用推导列表形成一个新的名字列表,然后再用字符串里的.startswith("ZHANG")取出符合的名字
def _change(text):
new_s1=text.split()[0:2]
reverse_s1=new_s1[::-1]
return ' '.join(reverse_s1)
new_names_lists=[_change(name) for name in names.split(',')]
names_with_ZHANG=[name for