近些年随着python的越来越火,python也渐渐成为了很多程序员的喜爱。许多程序员已经开始使用python作为第一语言来刷题。
Python算法常用技巧与内置库
近些年跟着python的越来越火,python也逐渐成为了许多程序员的喜欢。许多程序员现已开始运用python作为榜首言语来刷题。
最近我在用python刷题的时分想去找点python的刷题常用库api和刷题技巧来看看。类似于C++的STL库文档相同,可是很可惜并没有找到,所以决议结合自己的刷题经历和上网查找做一份文档出来,供自己和咱们观看查阅。
1.输入输出:
1.1 榜首行给定两个值n,m,用空格切开,榜首个n决议接下来有n行的输入,m决议每一行有多少个数字,m个数字均用空格分隔.
处理办法:python的input函数接纳到的输入默许都是字符串,所以咱们运用 字符串切开、强制类型转化、列表生成器就能够完美处理输入问题。代码如下:
- #接纳两个值,运用n,m别离接纳列表中的两个值
- n,m=[int(x)forxininput().split()]
- #结构输入列表的列表
- num_list=[]
- foriinrange(n):
- #python能够不必介意m的值,将一切数值接纳进来然后运用len判别长度
- tmp_list=[int(x)forxininput().split()]
- num_list.append(tmp_list)
同理,若是用逗号(,)分隔的话,split函数中传入相同的值就行。
1.2 输出一行数字
拜访python的print函数默许运用换行作为完毕符,所以咱们需求将它修正成咱们需求的距离,代码如下:
- foriinrange(10):
- print(i,end='')
end是print函数中的一个参数,决议输出的完毕字符,这儿修正成空格代表输出一行数字,用空格距离,其它字符能够自行修正。
2.空列表生成,字符串修正,列表遍历
2.1 代码编写过程中,有时分会需求一个带有长度的,有初始值的空列表,生成办法如下:
- #1.用乘法生成一个初始值为False的长度为100的一维列表
- visited=[False]*100
- #2.运用列表生成器生成一个n*m的二维的初始值为0的列表
- visited=[[0foriinrange(m)]forjinrange(n)]
2.2 在python傍边字符串是无法原地修正的,假如每次修正都生成一个新字符串,那么对修正次数许多且字符串很当的状况,开支是很大的。所以一般是把字符串转为列表进行修正最终再转回来。
- string='Ilovetoeatchicken'
- #将字符串转化成列表
- string_list=list(string)
- #.......对字符串列表进行修正
- #Code
- #将字符串列表从头拼接成字符串
- #string=''.join(string_list)
2.3 python中列表遍历有许多种不同的办法,最直接的办法是直接对列表进行迭代遍历,可是由于咱们往往是根据索引对数组进行操作且需求修正数组的值,所以更引荐用以下代码中的第二三中办法:
- num_list=[iforiinrange(10)]
- #1.直接迭代列表
- foriteminnum_list:
- #Code
- pass
- #2.经过索引进行迭代
- foriinrange(len(num_list)):
- print(num_list[i])
- #3.经过enumerate函数进行迭代
- forindex,valueinenumerate(num_list):
- #index为当时元素的索引,value为当时元素的值
- print(index,value)
3. collections库的运用
3.1 deque行列
deque 是python中的行列(FIFO先进先出),行列在进行队首弹出的时分会比list要快。
尤其在运用BFS(深度优先查找)的时分,行列是有必要要运用到的。部分deque运用代码如下:
- fromcollectionsimportdeque
- #初始化一个最大长度为3的行列
- d=deque([1,2,3],maxlen=3)
- #由于初始化行列最大长度为3,再增加元素会把队头元素挤出
- d.append(4)
- #初始化一个不约束长度的行列
- d=deque()
- #增加元素到队尾部
- d.append(1)
- d.append(2)
- d.append(3)
- #将队首的元素弹出回来
- print(d.popleft())
- #弹出队尾元素并回来值
- print(d.pop())
- #在队首刺进元素
- d.appendleft(0)
3.2 Counter计数器
Counter 是一个计数器,能够对一个序列计数,核算序列中某个元素呈现的数量。
以下是示例代码:
- importcollections
- #一共有三种初始办法
- #1.传入一个序列
- print(collections.Counter(['a','b','c','a','b','b']))
- #2.传入一个字典
- print(collections.Counter({'a':2,'b':3,'c':1}))
- #3.直接运用=传参
- print(collections.Counter(a=2,b=3,c=1))
- #也能够无参数结构,运用update函数更新
- c=collections.Counter()
- print('Initial:',c)
- #Initial:Counter()
- c.update('abcdaab')
- print('Sequence:',c)
- #Sequence:Counter({'a':3,'b':2,'c':1,'d':1})
- c.update({'a':1,'d':5})
- print('Dict:',c)
- #Dict:Counter({'d':6,'a':4,'b':2,'c':1})
- #能够经过拜访字典的拜访办法拜访Counter目标
- forletterin'abcde':
- print('%s:%d'%(letter,c[letter]))
- #elements()办法能够回来一个包括一切Counter数据的迭代器
- c=collections.Counter('extremely')
- c['z']=0
- print(list(c.elements()))
- #['e','e','e','m','l','r','t','y','x']
- #most_common()回来前n个最多的数据
- c=collections.Counter('aassdddffff')
- forletter,countinc.most_common(2):
- print('%s:%d'%(letter,count))
- #f:4
- #d:3
- #Counter目标能够进行加减交并,直接运用运算符+、-、&、|
- #+会将两个字典中相同字符的呈现次数相加,-会给出榜首个Counter相对于第二个的差集。交集给出两个计数器傍边都有的元素,且计数被赋值为较小的那个,并集为两个计数器的元素呈现最多的那个。
- c1=collections.Counter(['a','b','c','a','b','b'])
- c2=collections.Counter('alphabet')
- print('C1:',c1)
- print('C2:',c2)
- print('\nCombinedcounts:')
- print(c1+c2)
- print('\nSubtraction:')
- print(c1-c2)
- print('\nIntersection(takingpositiveminimums):')
- print(c1&c2)
- print('\nUnion(takingmaximums):')
- print(c1|c2)
- #以下为输出:
- C1:Counter({'b':3,'a':2,'c':1})
- C2:Counter({'a':2,'l':1,'p':1,'h':1,'b':1,'e':1,'t':1})
- Combinedcounts:
- Counter({'a':4,'b':4,'c':1,'l':1,'p':1,'h':1,'e':1,'t':1})
- Subtraction:
- Counter({'b':2,'c':1})
- Intersection(takingpositiveminimums):
- Counter({'a':2,'b':1})
- Union(takingmaximums):
- 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)来创立一个默许值为列表的字典。
- #list的默许值为空列表
- list_dict=collections.defaultdict(list)
- #int的默许值为0
- int_dict=collections.defaultdict(int)
- print(list_dict['a'])
- print(int_dict['a'])
- #输出:[]
- #输出:0
3.4 小结
collection中常被用来写算法和数据结构的便是这几个,其它比方排序字典和命名元组很少会用上。
4.排序
4.1 对列表排序
对列表排序有两种办法,一种是运用列表内置的sort函数,sort函数直接在列表原地修正,无回来值,能够经过参数key自定义比较的key和比较函数。
第二种便是运用python的sorted函数,这个函数自由度比较高,能够自己设定比较函数和比较的key,回来一个新的列表。
假如需求自定义比较的函数,需求从库functools导入函数cmp_to_key函数,将比较函数转为key,运用代码如下:
- defcustom_sort(x,y):
- ifx>y:
- #回来-1代表需求排在前面
- return-1
- ifx<y:
- #回来1代表需求排在后边
- return1
- return0
- lst=[iforiinrange(10,-1,-1)]
- print(lst)
- lst.sort()
- print(lst)
- print(sorted(lst,key=cmp_to_key(custom_sort)))
- #输出如下:
- #[10,9,8,7,6,5,4,3,2,1,0]
- #[0,1,2,3,4,5,6,7,8,9,10]
- #[10,9,8,7,6,5,4,3,2,1,0]
4.2 对字典/元组列表排序
若是需求对字典(将字典运用item函数转化成元组列表)或许元组列表这种每一个item有两个值的序列进行排序,这个时分就需求运用sorted函数中的key来决议取哪个值排序。代码如下:
- #运用字符串创立计数器字典
- d=dict(collections.Counter('HelloWorld'))
- print(d)
- #排序
- print(sorted(d.items(),key=lambdax:x[1],reverse=True))
- #输出如下:
- #{'H':1,'e':1,'l':3,'o':2,'':1,'W':1,'r':1,'d':1}
- #[('l',3),('o',2),('H',1),('e',1),('',1),('W',1),('r',1),('d',1)]
5.摆放组合
python内置的模块itertools中集成了一些与迭代有关的函数,其间就有摆放组合函数。
5.1 摆放
摆放函数permutations接纳一个列表,回来这个列表内一切元素的全摆放列表。
0
- foriinrange(10):
- print(i,end='')
5.2 组合
组合函数combinations接纳两个参数,榜首个为一个需求进行组合的列表,第二个参数为一个正整数,代表从列表中抽取多少个元素进行组合,回来一个组合列表。
1
- foriinrange(10):
- print(i,end='')
6.小技巧
6.1 在python中分了可变类型和不可变类型,当函数传参的时分:
- 若是不可变类型如字符串,则传递参数的时分会深复制一份,在新的数据上修正并不改动原数据
- 若是可变类型如列表,则传递参数的时分传递的是引证,归于浅复制,在函数中对新列表进行操作会影响到本来的列表。
若是的确需求传递可变类型进入函数,则能够在函数内部榜首行进行一次深复制如:
2
- foriinrange(10):
- print(i,end='')
6.2 当删去列表中的元素的时分,列表后边的元素会主动往前移动,导致犯错
例如,列表为[1,2,3,4,5,6],想要删去列表中的偶数,假如直接找到一个偶数然后运用其索引删去,如下代码所示(过错演示),那么很抱愧,出问题了。
3
- foriinrange(10):
- print(i,end='')
下面的代码才是正确演示:
4
- foriinrange(10):
- print(i,end='')
若是需求更杂乱的挑选手法,能够在if i%2 !=0那里更改成一个函数判别,函数内部就完成挑选办法。
6.3 拜访字典元素要运用get办法
前文说过,一般的dict字典是没有默许值的,所以这个时分假如直接运用中括号放置key来查找value的话是有可能会报错的。
那么为了防止这种状况,在运用字典的key来取value的时分,需求运用字典的get函数。
get函数的榜首个参数为key,第二个参数为可选(默许为None),当字典中找不到传入的key的时分,会回来第二个参数所赋的值。
7.小结
以上是本人在运用python刷题的时分作的一些总结,若有不到位的地方请指出。
本文旨在为自己做一个文档,徘徊也为咱们供给一些便当。
重视我的大众号【程序小员】,收货一大波福利常识。
我是落阳,谢谢你的到访。
知优网 » Python算法常用技巧与内置库(python内置库使用)