近些年随着python的越来越火,python也渐渐成为了很多程序员的喜爱。许多程序员已经开始使用python作为第一语言来刷题。

 Python算法常用技巧与内置库(python内置库使用) Python 代码 字符串 第1张

Python算法常用技巧与内置库

近些年跟着python的越来越火,python也逐渐成为了许多程序员的喜欢。许多程序员现已开始运用python作为榜首言语来刷题。

最近我在用python刷题的时分想去找点python的刷题常用库api和刷题技巧来看看。类似于C++的STL库文档相同,可是很可惜并没有找到,所以决议结合自己的刷题经历和上网查找做一份文档出来,供自己和咱们观看查阅。

1.输入输出:

1.1 榜首行给定两个值n,m,用空格切开,榜首个n决议接下来有n行的输入,m决议每一行有多少个数字,m个数字均用空格分隔.

处理办法:python的input函数接纳到的输入默许都是字符串,所以咱们运用 字符串切开、强制类型转化、列表生成器就能够完美处理输入问题。代码如下:

  1. #接纳两个值,运用n,m别离接纳列表中的两个值
  2. n,m=[int(x)forxininput().split()]
  3. #结构输入列表的列表
  4. num_list=[]
  5. foriinrange(n):
  6. #python能够不必介意m的值,将一切数值接纳进来然后运用len判别长度
  7. tmp_list=[int(x)forxininput().split()]
  8. num_list.append(tmp_list)

同理,若是用逗号(,)分隔的话,split函数中传入相同的值就行。

1.2 输出一行数字

拜访python的print函数默许运用换行作为完毕符,所以咱们需求将它修正成咱们需求的距离,代码如下:

  1. foriinrange(10):
  2. print(i,end='')

end是print函数中的一个参数,决议输出的完毕字符,这儿修正成空格代表输出一行数字,用空格距离,其它字符能够自行修正。

2.空列表生成,字符串修正,列表遍历

2.1 代码编写过程中,有时分会需求一个带有长度的,有初始值的空列表,生成办法如下:

  1. #1.用乘法生成一个初始值为False的长度为100的一维列表
  2. visited=[False]*100
  3. #2.运用列表生成器生成一个n*m的二维的初始值为0的列表
  4. visited=[[0foriinrange(m)]forjinrange(n)]

2.2 在python傍边字符串是无法原地修正的,假如每次修正都生成一个新字符串,那么对修正次数许多且字符串很当的状况,开支是很大的。所以一般是把字符串转为列表进行修正最终再转回来。

  1. string='Ilovetoeatchicken'
  2. #将字符串转化成列表
  3. string_list=list(string)
  4. #.......对字符串列表进行修正
  5. #Code
  6. #将字符串列表从头拼接成字符串
  7. #string=''.join(string_list)

2.3 python中列表遍历有许多种不同的办法,最直接的办法是直接对列表进行迭代遍历,可是由于咱们往往是根据索引对数组进行操作且需求修正数组的值,所以更引荐用以下代码中的第二三中办法:

  1. num_list=[iforiinrange(10)]
  2. #1.直接迭代列表
  3. foriteminnum_list:
  4. #Code
  5. pass
  6. #2.经过索引进行迭代
  7. foriinrange(len(num_list)):
  8. print(num_list[i])
  9. #3.经过enumerate函数进行迭代
  10. forindex,valueinenumerate(num_list):
  11. #index为当时元素的索引,value为当时元素的值
  12. print(index,value)

3. collections库的运用

3.1 deque行列

deque 是python中的行列(FIFO先进先出),行列在进行队首弹出的时分会比list要快。

尤其在运用BFS(深度优先查找)的时分,行列是有必要要运用到的。部分deque运用代码如下:

  1. fromcollectionsimportdeque
  2. #初始化一个最大长度为3的行列
  3. d=deque([1,2,3],maxlen=3)
  4. #由于初始化行列最大长度为3,再增加元素会把队头元素挤出
  5. d.append(4)
  6. #初始化一个不约束长度的行列
  7. d=deque()
  8. #增加元素到队尾部
  9. d.append(1)
  10. d.append(2)
  11. d.append(3)
  12. #将队首的元素弹出回来
  13. print(d.popleft())
  14. #弹出队尾元素并回来值
  15. print(d.pop())
  16. #在队首刺进元素
  17. d.appendleft(0)

3.2 Counter计数器

Counter 是一个计数器,能够对一个序列计数,核算序列中某个元素呈现的数量。

以下是示例代码:

  1. importcollections
  2. #一共有三种初始办法
  3. #1.传入一个序列
  4. print(collections.Counter(['a','b','c','a','b','b']))
  5. #2.传入一个字典
  6. print(collections.Counter({'a':2,'b':3,'c':1}))
  7. #3.直接运用=传参
  8. print(collections.Counter(a=2,b=3,c=1))
  9. #也能够无参数结构,运用update函数更新
  10. c=collections.Counter()
  11. print('Initial:',c)
  12. #Initial:Counter()
  13. c.update('abcdaab')
  14. print('Sequence:',c)
  15. #Sequence:Counter({'a':3,'b':2,'c':1,'d':1})
  16. c.update({'a':1,'d':5})
  17. print('Dict:',c)
  18. #Dict:Counter({'d':6,'a':4,'b':2,'c':1})
  19. #能够经过拜访字典的拜访办法拜访Counter目标
  20. forletterin'abcde':
  21. print('%s:%d'%(letter,c[letter]))
  22. #elements()办法能够回来一个包括一切Counter数据的迭代器
  23. c=collections.Counter('extremely')
  24. c['z']=0
  25. print(list(c.elements()))
  26. #['e','e','e','m','l','r','t','y','x']
  27. #most_common()回来前n个最多的数据
  28. c=collections.Counter('aassdddffff')
  29. forletter,countinc.most_common(2):
  30. print('%s:%d'%(letter,count))
  31. #f:4
  32. #d:3
  33. #Counter目标能够进行加减交并,直接运用运算符+、-、&、|
  34. #+会将两个字典中相同字符的呈现次数相加,-会给出榜首个Counter相对于第二个的差集。交集给出两个计数器傍边都有的元素,且计数被赋值为较小的那个,并集为两个计数器的元素呈现最多的那个。
  35. c1=collections.Counter(['a','b','c','a','b','b'])
  36. c2=collections.Counter('alphabet')
  37. print('C1:',c1)
  38. print('C2:',c2)
  39. print('\nCombinedcounts:')
  40. print(c1+c2)
  41. print('\nSubtraction:')
  42. print(c1-c2)
  43. print('\nIntersection(takingpositiveminimums):')
  44. print(c1&c2)
  45. print('\nUnion(takingmaximums):')
  46. print(c1|c2)
  47. #以下为输出:
  48. C1:Counter({'b':3,'a':2,'c':1})
  49. C2:Counter({'a':2,'l':1,'p':1,'h':1,'b':1,'e':1,'t':1})
  50. Combinedcounts:
  51. Counter({'a':4,'b':4,'c':1,'l':1,'p':1,'h':1,'e':1,'t':1})
  52. Subtraction:
  53. Counter({'b':2,'c':1})
  54. Intersection(takingpositiveminimums):
  55. Counter({'a':2,'b':1})
  56. Union(takingmaximums):
  57. Counter({'b':3,'a':2,'c':1,'l':1,'p':1,'h':1,'e':1,'t':1})

3.3 defaultdict——带有默许值的字典

一般状况下创立的字典dict是不含有默许值的,即若是字典中不包括a这个key,调用dct{a}的话就会报错。

在进行算法规划和数据结构规划的时分咱们期望恣意给定一个key都能从字典中取出值来,哪怕仅仅一个默许值,这个时分咱们就需求用到defaultdict。

例如在用字典表明图中一个节点的相连节点的时分,咱们期望将这个节点作为一个key,然后与它相连的节点组成一个列表作为它的value,这个时分咱们就能够运用defaultdict(list)来创立一个默许值为列表的字典。

  1. #list的默许值为空列表
  2. list_dict=collections.defaultdict(list)
  3. #int的默许值为0
  4. int_dict=collections.defaultdict(int)
  5. print(list_dict['a'])
  6. print(int_dict['a'])
  7. #输出:[]
  8. #输出:0

3.4 小结

collection中常被用来写算法和数据结构的便是这几个,其它比方排序字典和命名元组很少会用上。

4.排序

4.1 对列表排序

对列表排序有两种办法,一种是运用列表内置的sort函数,sort函数直接在列表原地修正,无回来值,能够经过参数key自定义比较的key和比较函数。

第二种便是运用python的sorted函数,这个函数自由度比较高,能够自己设定比较函数和比较的key,回来一个新的列表。

假如需求自定义比较的函数,需求从库functools导入函数cmp_to_key函数,将比较函数转为key,运用代码如下:

  1. defcustom_sort(x,y):
  2. ifx>y:
  3. #回来-1代表需求排在前面
  4. return-1
  5. ifx<y:
  6. #回来1代表需求排在后边
  7. return1
  8. return0
  9. lst=[iforiinrange(10,-1,-1)]
  10. print(lst)
  11. lst.sort()
  12. print(lst)
  13. print(sorted(lst,key=cmp_to_key(custom_sort)))
  14. #输出如下:
  15. #[10,9,8,7,6,5,4,3,2,1,0]
  16. #[0,1,2,3,4,5,6,7,8,9,10]
  17. #[10,9,8,7,6,5,4,3,2,1,0]

4.2 对字典/元组列表排序

若是需求对字典(将字典运用item函数转化成元组列表)或许元组列表这种每一个item有两个值的序列进行排序,这个时分就需求运用sorted函数中的key来决议取哪个值排序。代码如下:

  1. #运用字符串创立计数器字典
  2. d=dict(collections.Counter('HelloWorld'))
  3. print(d)
  4. #排序
  5. print(sorted(d.items(),key=lambdax:x[1],reverse=True))
  6. #输出如下:
  7. #{'H':1,'e':1,'l':3,'o':2,'':1,'W':1,'r':1,'d':1}
  8. #[('l',3),('o',2),('H',1),('e',1),('',1),('W',1),('r',1),('d',1)]

5.摆放组合

python内置的模块itertools中集成了一些与迭代有关的函数,其间就有摆放组合函数。

5.1 摆放

摆放函数permutations接纳一个列表,回来这个列表内一切元素的全摆放列表。

  1. foriinrange(10):
  2. print(i,end='')
0

5.2 组合

组合函数combinations接纳两个参数,榜首个为一个需求进行组合的列表,第二个参数为一个正整数,代表从列表中抽取多少个元素进行组合,回来一个组合列表。

  1. foriinrange(10):
  2. print(i,end='')
1

6.小技巧

6.1 在python中分了可变类型和不可变类型,当函数传参的时分:

  • 若是不可变类型如字符串,则传递参数的时分会深复制一份,在新的数据上修正并不改动原数据
  • 若是可变类型如列表,则传递参数的时分传递的是引证,归于浅复制,在函数中对新列表进行操作会影响到本来的列表。

若是的确需求传递可变类型进入函数,则能够在函数内部榜首行进行一次深复制如:

  1. foriinrange(10):
  2. print(i,end='')
2

6.2 当删去列表中的元素的时分,列表后边的元素会主动往前移动,导致犯错

例如,列表为[1,2,3,4,5,6],想要删去列表中的偶数,假如直接找到一个偶数然后运用其索引删去,如下代码所示(过错演示),那么很抱愧,出问题了。

  1. foriinrange(10):
  2. print(i,end='')
3

下面的代码才是正确演示:

  1. foriinrange(10):
  2. print(i,end='')
4

若是需求更杂乱的挑选手法,能够在if i%2 !=0那里更改成一个函数判别,函数内部就完成挑选办法。

6.3 拜访字典元素要运用get办法

前文说过,一般的dict字典是没有默许值的,所以这个时分假如直接运用中括号放置key来查找value的话是有可能会报错的。

那么为了防止这种状况,在运用字典的key来取value的时分,需求运用字典的get函数。

get函数的榜首个参数为key,第二个参数为可选(默许为None),当字典中找不到传入的key的时分,会回来第二个参数所赋的值。

7.小结

以上是本人在运用python刷题的时分作的一些总结,若有不到位的地方请指出。

本文旨在为自己做一个文档,徘徊也为咱们供给一些便当。

重视我的大众号【程序小员】,收货一大波福利常识。

我是落阳,谢谢你的到访。

转载请说明出处
知优网 » Python算法常用技巧与内置库(python内置库使用)

发表评论

您需要后才能发表评论