算法题Python常用内置函数、方法、技巧汇总(其一:列表)
列表相关操作
排序
列表的方法sort()
或者内置函数sorted()
可以完成排序操作。
# 对lst本身进行升序排列,使用sort()方法
lst = [3, 1, 2]
lst.sort()
# 得到一个新的升序列表,lst保持不变,使用sorted()内置函数
lst = [3, 1, 2]
lst_sorted = list(sorted(lst))
注意:无论是方法sort()
或者内置函数sorted()
都有两个形参,reverse
和key
,前者表示是否倒序排列,后者表示排序的依据,通常会涉及到lambda
匿名函数的使用。关于key
形参以及lambda
匿名函数的使用可以详见真题【排序】2023Q1A-身高提供排序 中的进阶部分。
# 对lst本身进行降序排列,使用sort()方法
lst = [3, 1, 2]
lst.sort(reverse = True)
# 得到一个新的降序列表,lst保持不变,使用sorted()内置函数
lst = [3, 1, 2]
lst_sorted = list(sorted(lst, reverse = True))
翻转
列表的方法reverse()
或者内置函数reversed()
可以完成翻转操作。
# 对lst本身进行翻转,使用reverse()方法
lst = [3, 1, 2]
lst.reverse()
# 得到一个新的翻转列表,lst保持不变,使用reversed()内置函数
lst = [3, 1, 2]
lst_reversed = list(reversed(lst))
也可以使用列表的切片操作来完成翻转,设置步长为-1
即可。
# 得到一个新的翻转列表,lst保持不变,使用切片操作
lst = [3, 1, 2]
lst_reversed = lst[::-1]
枚举
如果想在for
循环中同时获得列表的索引i
和元素值v
,可以使用枚举内置函数enumerate(lst)
,其语法如下:
lst = ["a", "b", "c"]
for i, v in enumerate(lst):
print(i, v)
# 依次输出
# 0 a
# 1 b
# 2 c
这种写法等价于:
lst = ["a", "b", "c"]
for i in range(len(lst)):
v = lst[i]
print(i, v)
另外,enumerate(lst, start)
支持传入第二个参数start
,表示索引i
的从start
开始计数。譬如
lst = ["a", "b", "c"]
for i, v in enumerate(lst, 1):
print(i, v)
# 由于i会从1而不是从0开始,
# 依次输出
# 1 a
# 2 b
# 3 c
上述用法经常在固定滑窗题目中,搭配列表的切片来使用。譬如
k = 2 # 一个固定长度为2的滑窗
lst = ["a", "b", "c", "d", "e"]
for i, v in enumerate(lst[k:], k):
print(i, v)
# 由于i会从2而不是从0开始,
# 依次输出
# 2 c
# 3 d
# 4 3
合并
有两个长度相等的列表a_lst
和b_lst
,如果想获得由同一索引对应元素构成的二元元组列表,可以使用内置函数zip()
。
a_lst = [0, 1, 2]
b_lst = ["a", "b", "c"]
# 得到二维列表[(0, 'a'), (1, 'b'), (2, 'c')]
merge_lst = list(zip(a_lst, b_lst))
更常见的使用场景是在for
循环中:
a_lst = [0, 1, 2]
b_lst = ["a", "b", "c"]
for a, b in zip(a_lst, b_lst):
print(a, b)
去重
直接使用哈希集合set()
的特性,即可完成列表的去重。
lst = [1, 1, 2, 3, 3]
lst_nonrepeat = list(set(lst))
拷贝
先思考执行以下代码,为什么列表a
会随着列表b
的变化而变化?
a = [1,2,3]
b = a
b[0] = 0
print(b)
# 得到[0,2,3]
print(a)
# 得到[0,2,3]
这实际上涉及到python一切皆对象的设计思想,此处的a
和b
是同一个列表对象的两个别名,它们表示同一个列表,因此修改b
会牵连到a
。这也是初学者非常容易犯的一个错误。
为了使得a
和b
指向两个不同的列表对象,我们在赋值操作时可以有两种操作,来让b
获得a
的拷贝:
- 使用切片。即令
b = a[:]
a = [1,2,3]
b = a[:]
b[0] = 0
print(b)
# 得到[0,2,3]
print(a)
# 得到[1,2,3]
- 使用
copy()
方法。即令b = a.copy()
a = [1,2,3]
b = a.copy()
b[0] = 0
print(b)
# 得到[0,2,3]
print(a)
# 得到[1,2,3]
以上两种方法,都可以使得a
和b
表示两个不同的(但值相同的)列表对象。这个技巧在回溯算法中非常常见。
华为OD算法/大厂面试高频题算法练习冲刺训练
-
华为OD算法/大厂面试高频题算法冲刺训练目前开始常态化报名!目前已服务100+同学成功上岸!
-
课程讲师为全网50w+粉丝编程博主@吴师兄学算法 以及小红书头部编程博主@闭着眼睛学数理化
-
每期人数维持在20人内,保证能够最大限度地满足到每一个同学的需求,达到和1v1同样的学习效果!
-
60+天陪伴式学习,40+直播课时,300+动画图解视频,300+LeetCode经典题,200+华为OD真题/大厂真题,还有简历修改、模拟面试、专属HR对接将为你解锁
-
可上全网独家的欧弟OJ系统练习华子OD、大厂真题
-
可查看链接 大厂真题汇总 & OD真题汇总(持续更新)
-
绿色聊天软件戳
od1336
了解更多
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。 如若内容造成侵权/违法违规/事实不符,请联系我的编程经验分享网邮箱:veading@qq.com进行投诉反馈,一经查实,立即删除!