python算法口诀_有哪些问题可以通过python使用一句原生语句求得?

我想做一个楼层,收集Python一句话的工作本:

1.求100以内的素数

[x for x in range(1,100) if not [y for y in range(2,x) if x % y == 0]]

2.生成字母表

[chr(i) for i in range(97,123)] #输出列表

''.join([chr(i) for i in range(97,123)]) #输出字符串

3.一句话生成乘法口诀表

'\n'.join([' '.join(["%2sx%2s=%2s"%(j,i,i*j) for j in range(1,i+1)]) for i in range(1,10)])

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])

10.1.按字符串主次位进行排序(同样适用于字符串)

sorted(['0453','0187','9854','7251'],key=lambda x:(x[0],x[1],x[2]))

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')

#输出['', '1', '24', '56', '78']

26.1. 输出只输出数、字混合列表值中的字母部分

list(map("".join,list(map(lambda x : [y for y in str(x) if ord('A')

#输出['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.对字典按键(key)进行排序(注意:输出列表)

sorted({'BB':3,'CC':2,'AA':1}.items(), key=lambda d:d[0])

29.1.对字典按值(value)进行排序(注意:输出列表)

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])))

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()))

32.保留字符串中的内容

''.join(list(filter(lambda x: x in '0123456789abcdefghijklmnopqrstuvwxyz', '1!q,b>')))

#or

''.join([x for x in '1!q,b>' if x in '0123456789abcdefghijklmnopqrstuvwxyz'])

32.1.也可以筛除不喜欢的字符

''.join(list(filter(lambda x: x not in '!,>', '1!q,b>')))

#or

''.join([x for x in '1!q,b>' if x not in '!,>'])

33.leetcode题目(No.136):只出现一次的数字(Python用这种方法超时了)

return sorted(dict([(i,nums.count(i)) for i in nums]).items(), key=lambda x: x[1])[0][0]

33.1.字典由value查key

{v : k for k, v in {'A':2,'B':4} if(v==4)}

#or

[k for k, v in {'A':2,'B':4} if(v==4)]

34.leetcode题目(No.169):多数元素(Python用这种方法超时了)

return [x for x,y in dict([(i,nums.count(i)) for i in nums]).items() if(y>len(nums)/2)][0]

35.leetcode题目(No.401):二进制手表(转自评论区)

return list("%d:%02d"%(i, j) for j in range(60) for i in range(12) if num == bin(i).count('1') + bin(j).count('1'))

36.leetcode题目(No.290):单词规律(转自评论区)

return (list(map(str.split(" ").index,str.split(" "))) == list(map(pattern.index,pattern)))

我觉得在这里罗列增加刷题中的一行解挺无聊的,以后只罗列有价值的一行语句。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值