python算法常用技巧与内置库 (2)

例如在用字典表示图中一个节点的相连节点的时候,我们希望将这个节点作为一个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,使用代码如下:

def custom_sort(x,y): if x>y: # 返回-1代表需要排在前面 return -1 if x<y: # 返回1代表需要排在后面 return 1 return 0 lst = [i for i in range(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('Hello World')) print(d) # 排序 print(sorted(d.items(), key=lambda x: 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接收一个列表,返回这个列表内所有元素的全排列列表。

from itertools import permutations print(list(permutations([1,2,3]))) # 输出如下: # [(1, 2, 3), (1, 3, 2), (2, 1, 3), (2, 3, 1), (3, 1, 2), (3, 2, 1)]

5.2 组合

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

from itertools import combinations print(list(combinations([1,2,3],2))) # 输出如下: # [(1, 2), (1, 3), (2, 3)] 6.小技巧

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

若是不可变类型如字符串,则传递参数的时候会深拷贝一份,在新的数据上修改并不改变原数据

若是可变类型如列表,则传递参数的时候传递的是引用,属于浅拷贝,在函数中对新列表进行操作会影响到原来的列表。

若是确实需要传递可变类型进入函数,则可以在函数内部第一行进行一次深拷贝如:

def test(num_list:list): # 进行深拷贝 num_list = num_list[:]

6.2 当删除列表中的元素的时候,列表后面的元素会自动往前移动,导致出错

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/wsppxs.html