本人新手,用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()))