本人新手,用python写脚本,发现有些内置函数的小把戏能很快解决问题(或动态调用的也行),特开贴罗列之。
此贴持续更新,如果有大神支招,我会在文中添加并注明出处(和你的博文地址)。
1.求100以内的素数
[x for x in range(1,100) if not [y for y in range(2,x) if x % y == 0]]
#如果你产生的数很大,就得这样优化下字符串
[x for x in range(1,10000) if not [y for y in range(2,round(x**0.5)) if x % y == 0]]
2.生成字母表(转)
[chr(i) for i in range(97,123)] #输出列表
''.join([chr(i) for i in range(97,123)]) #输出字符串
3.一些trips如:一句话生成乘法口诀表,一句话打印心形图案,一句话打印迷宫就不说了,
还有这exec函数有点作弊的味道,不过多讨论,比如:
exec("""\nfrom turtle import *\nfor i in range(500):\n forward(i)\n left(91)\n""")
4.一句话改大小写字符串(虽然有点重复)
list(map(lambda x:x.upper(),"abc")) #输出列表
"".join(map(lambda x:x.upper(),"abc")) #输出字符串
4.1.一句话改写单词词组大小写
list(map(lambda x:x.upper(),['abc','abcd','abcde','abcdefg']))
5.分别合并两数组
[[x, y] for x, y in zip('abc', 'xyz')] #结果为二位数组
#输出:[['a', 'x'], ['b', 'y'], ['c', 'z']]
6.做字符的全排列
[x + y for x in 'abc' for y in 'xyz']
#输出:['ax', 'ay', 'az', 'bx', 'by', 'bz', 'cx', 'cy', 'cz']
6.1如果是数字的话,参照5和6问题,输出会不一样
[[x+y] for x, y in zip([1,2,3,4], [2,3,4,5])]
#输出:[[3], [5], [7], [9]]
[[x,y] for x, y in zip([1,2,3,4], [2,3,4,5])]
#输出:[[1, 2], [2, 3], [3, 4], [4, 5]]
[x + y for x in [1,2,3,4] for y in [2,3,4,5]]
#输出:[3, 4, 5, 6, 4, 5, 6, 7, 5, 6, 7, 8, 6, 7, 8, 9]
[[x + y] for x in [1,2,3,4] for y in [2,3,4,5]]
#输出:[[3], [4], [5], [6], [4], [5], [6], [7], [5], [6], \n
# [7],[8], [6], [7], [8], [9]]
7.产生逆序的指定个数的偶数
sorted((x*2 for x in range(11)), reverse=True)
#或
sorted([x for x in [1,2,3,4,5,6,7,8,9,10] if x%2==0],reverse=True)
8. 可以使用字符串计算器
eval(input())
#或
eval('78+23*100')
#或
eval('max([2,4,5])')
9.按字符串长度排序
sorted(['abcde','abcd','ab','a'],key=lambda x:len(x))
10.按字符串某一位进行排序(具有稳定性)
sorted(['acb','abc','cab','aaa'], key=lambda x: x[1])
11.筛选出列表中的偶数
list(filter(lambda x:x%2!=0,[1,2,3,4,5,6,7,8,9,10]))
或
[x for x in [1,2,3,4,5,6,7,8,9,10] if x%2==0]
12.挑出含有某个字母的词组
list(filter(lambda x:'w'in x,['apple','watermelon','pear','banana']))
#或
[x for x in ['apple','watermelon','pear','banana'] if 'b' in x]
12.1挑出第n位含有某个字母的词组
list(filter(lambda x:'a'in x[0],['apple','watermelon','pear','banana']))
#或
[x for x in ['apple','watermelon','pear','banana'] if x[0] =='a' ]
13.将词组中第N→M位拼接在一起输出字符串
''.join([x[1:3] for x in ['apple','watermelon','pear','banana']])
14.一句话改变词组的第N位大小写
[x[0]+x[1].upper()+x[2:] for x in ['apple','watermelon','pear','banana']]
15.一句话计算n的阶乘
eval('*'.join([str(x) for x in range(11)][1:]))
15.1.一句话计算N→M的阶乘
eval('*'.join([str(x) for x in range(11)][9:]))
#range(M+1)控制M,[N:]切片控制N
16.一句话定义二维数组
[[0 for col in range(cols)] for row in range(rows)]
#注意这样是不行的 [[]*rows]*cols
17.交换字典的键和值
{v: k for k, v in dict.items()}
18. CSV转JSON(命令行中输入)
python -c "import csv,json;print json.dumps(list(csv.reader(open('csv_file.csv'))))"
19.生成列表的带序遍历
list(enumerate(['AAA','BBB','CCC','DDD'], 1))
20.构造一个生成斐波拉契数列的匿名函数
fib = lambda n: n if n <= 2 else fib(n - 1) + fib(n - 2)
#使用
fib(10)
20.1 构造一个斐波拉契数列的列表生成式
#fib = lambda n: n if n <= 2 else fib(n - 1) + fib(n - 2)
[fib(n) for n in range(10,15)]
#输出[89, 144, 233, 377, 610]
20.2非递归方法实现斐波拉契数列(比20.1效率快很多)
注:此方法为转载,但由于标注原创的人很多,故未贴出出处。
[x[0] for x in [(a[i][0],a.append((a[i][1],a[i][0]+a[i][1]))) for a in ([[1,1]],) for i in range(20)]]
20.3对于20.2,既然是列表,那就可以使用切片器取相应的值
[x[0] for x in [(a[i][0],a.append((a[i][1],a[i][0]+a[i][1]))) for a in ([[1,1]],) for i in range(20)]][3:10]
#输出[3, 5, 8, 13, 21, 34, 55]
21.获取字符串中的大小写:
list(filter(lambda x:not str(x).islower(),"asdasfAsfBsdfC"))
22.求方程的值,可包括多元、多次。
[x**2+y**2 for x, y in zip([1,2,3,4,5], [5,4,3,2,1])]
23. 拆分2维数组并组合为一元数组
#list_1 = [[1, 2], [3, 4, 5], [6, 7], [8], [9]]
[i for k in list_1 for i in k]
#或
sum(list_1, [])
24.对于reduce函数因为需要引用functools模块,不然可以完成更多的功能。
25.把数字列表转为字符串
''.join(list(map(str, [1, 2, 3, 4, 5, 6, 7, 8, 9])))
#这样是字符数组:
list(map(str, [1, 2, 3, 4, 5, 6, 7, 8, 9]))
26.只输出数、字混合列表值中的数字并将它转化为字符串
list(map("".join,list(map(lambda x : [y for y in str(x) if ord('0')<ord(y)<ord('9')],['AB',1,'CD24','5E6F','78']))))
#输出['', '1', '24', '56', '78']
26.1. 输出只输出数、字混合列表值中的字母部分
list(map("".join,list(map(lambda x : [y for y in str(x) if ord('A')<ord(y)<ord('z')],['AB',1,'CD24','5E6F','78']))))
#输出['B', '', 'CD', 'EF', '']
26.2. 以上语句中,将空的字符串删除
list(filter(None, MyList))
27. 二维字符串数组的“降维打击”
list(map("".join,[['AB','1','CD24'],['abc','1d2f','34']]))
#输出['AB1CD24', 'abc1d2f34']
28. 对有序号的列表元素进行重新排序号
list(enumerate([x[1] for x in [[3,'a'],[4,'b'],[5,'c']]],1))
29.对字典按键进行排序(注意:输出列表)
sorted({'BB':3,'CC':2,'AA':1}.items(), key=lambda d:d[0])
29.1.对字典按值进行排序(注意:输出列表)
sorted({'BB':3,'CC':2,'AA':1}.items(), key=lambda d:d[1])
30.对二维数组进行主、次关键字排序
sorted([[4,6,8],[4,3,1],[5,2,2],[5,2,8]],key=lambda x:(x[0],x[1],x[2]))
30.1如果需要逆序排列则:
sorted([[4,6,8],[4,3,1],[5,2,2],[5,2,8]],key=lambda x:(-x[0],x[1]))
30.2.这样还可以排列二维字符(但不能使用"-"完成逆序)
sorted([['c','c','b'],['c','a','b'],['b','a','b'],['b','c','b']],key=lambda x:(x[0],x[1]))
#这是字符串数组
sorted(['ccb','cab','bab','bcb'],key=lambda x:(x[0],x[1]))
30.3.如果我们要加入逆序排列思路,使用ord函数转换一下字符就可以了
sorted(['ccb','cab','bab','bcb'],key=lambda x:(ord(x[0]),-ord(x[1])))
31.一行搞定-统计一句话中每个单词出现的个数(转)
s = 'i am a boy a boy a boy'
dict([(i,s.split().count(i)) for i in s.split()])
#或(可以比较一下列表推导式和map函数的效率)
dict(map(lambda x:(x,s.split().count(x)),s.split()))